Non-B DNA structures across splice-sites
To investigate if non-B DNA structures can affect splicing, we explore the distribution of different motifs that are associated with Non-B DNA structures. We calculated the number of these motifs that can be found across splice sites (.num files) and then we calculated the positional enrichment of these across splice sites.
library(readr)
library(data.table)
package ‘data.table’ was built under R version 3.5.2data.table 1.12.2 using 2 threads (see ?getDTthreads). Latest news: r-datatable.com
Attaching package: ‘data.table’
The following object is masked _by_ ‘.GlobalEnv’:
.N
library(ggplot2)
package ‘ggplot2’ was built under R version 3.5.2Need help? Try Stackoverflow: https://stackoverflow.com/tags/ggplot2.
library(plyr)
library(cowplot)
package ‘cowplot’ was built under R version 3.5.2
Attaching package: ‘cowplot’
The following object is masked from ‘package:ggplot2’:
ggsave
library(Hmisc)
package ‘Hmisc’ was built under R version 3.5.2Loading required package: lattice
Loading required package: survival
Loading required package: Formula
Attaching package: ‘Hmisc’
The following objects are masked from ‘package:plyr’:
is.discrete, summarize
The following objects are masked from ‘package:base’:
format.pval, units
On this report we compile all the data analysis that lead us to get the final figures. For this, we processed several a
read_dist_table <- function(path){
dist_table <- data.table(read_delim(path,
"\t", escape_double = FALSE, col_names = FALSE,
trim_ws = TRUE))
dist_table <- dist_table[, 2:2001]
dist_table <- data.table(as.data.frame(t(dist_table)))
colnames(dist_table) <- c("Position", "Occurrences")
dist_table[,median:=median(Occurrences)]
dist_table[, Enrrichment:=Occurrences/median]
dist_table[, Position:=Position-1]
return(dist_table)
}
plot_density <- function(up_plus, up_minus, down_plus, down_minus){
up_TOTAL <- merge(up_plus, up_minus, by="Position")
up_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
up_TOTAL[,median:=median(Occurrences)]
up_TOTAL[, Enrrichment:=Occurrences/median]
up_TOTAL[, Position:=Position-1]
down_TOTAL <- merge(down_plus, down_minus, by="Position")
down_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
down_TOTAL[,median:=median(Occurrences)]
down_TOTAL[, Enrrichment:=Occurrences/median]
down_TOTAL[, Position:=Position-1]
up_TOTAL[ ,exon_pos:="Upstream"]
down_TOTAL[ ,exon_pos:="Downstream"]
TOTAL <- rbind(up_TOTAL, down_TOTAL)
TOTAL$exon_pos <- factor(TOTAL$exon_pos, levels=c("Upstream", "Downstream" ))
p <- ggplot(TOTAL)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
theme_bw()
#show(p)
TOTAL
}
plot_density_binomial <- function(up_plus, up_minus, down_plus, down_minus, observations, sig){
up_TOTAL <- merge(up_plus, up_minus, by="Position")
up_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
up_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
up_TOTAL <- cbind(up_TOTAL, up_TOTAL[, binconf(Occurrences, observations, alpha=sig) ])
up_TOTAL[,median:=median(PointEst)]
up_TOTAL[, Enrrichment:=PointEst/median]
up_TOTAL[, Enrrichment_l:=Lower/median]
up_TOTAL[, Enrrichment_u:=Upper/median]
up_TOTAL[, Position:=Position-1]
down_TOTAL <- merge(down_plus, down_minus, by="Position")
down_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
down_TOTAL <- cbind(down_TOTAL, down_TOTAL[, binconf(Occurrences, observations, alpha=sig) ])
down_TOTAL[,median:=median(PointEst)]
down_TOTAL[, Enrrichment:=PointEst/median]
down_TOTAL[, Enrrichment_l:=Lower/median]
down_TOTAL[, Enrrichment_u:=Upper/median]
down_TOTAL[, Position:=Position-1]
up_TOTAL[ ,exon_pos:="Upstream"]
down_TOTAL[ ,exon_pos:="Downstream"]
TOTAL <- rbind(up_TOTAL, down_TOTAL)
TOTAL$exon_pos <- factor(TOTAL$exon_pos, levels=c("Upstream", "Downstream" ))
p <- ggplot(TOTAL)+
geom_line(aes(x=Position,y=Enrrichment)) +
geom_ribbon(aes(ymin=Enrrichment_l, ymax=Enrrichment_u, x=Position), alpha=0.3 )+
facet_grid( . ~ exon_pos ) +
theme_bw()
#show(p)
return(TOTAL)
}
G-Quadruplexes
G4.up_plus <- read_dist_table("./All_non_Bs/G4.exon.up_plus.list.out.num")
G4.down_plus <- read_dist_table("./All_non_Bs/G4.exon.down_plus.list.out.num")
G4.up_minus <- read_dist_table("./All_non_Bs/G4.exon.up_minus.list.out.num")
G4.down_minus <- read_dist_table("./All_non_Bs/G4.exon.down_minus.list.out.num")
G4.up_minus[,Position:=Position*-1]
G4.down_minus[,Position:=Position*-1]
G4.TOTAL <- plot_density(G4.up_plus, G4.up_minus, G4.down_plus, G4.down_minus)
Directed repeats
DR.up_plus <- read_dist_table("./All_non_Bs/DR.exon.up_plus.list.out.num")
DR.down_plus <- read_dist_table("./All_non_Bs/DR.exon.down_plus.list.out.num")
DR.up_minus <- read_dist_table("./All_non_Bs/DR.exon.up_minus.list.out.num")
DR.down_minus <- read_dist_table("./All_non_Bs/DR.exon.down_minus.list.out.num")
DR.up_minus[,Position:=Position*-1]
DR.down_minus[,Position:=Position*-1]
DR.TOTAL <- plot_density(DR.up_plus, DR.up_minus, DR.down_plus, DR.down_minus)
H-DNA
H_DNA.up_plus <- read_dist_table("./All_non_Bs/H_DNA.exon.down_minus.list.out.num")
H_DNA.down_plus <- read_dist_table("./All_non_Bs/H_DNA.exon.down_plus.list.out.num")
H_DNA.up_minus <- read_dist_table("./All_non_Bs/H_DNA.exon.up_minus.list.out.num")
H_DNA.down_minus <- read_dist_table("./All_non_Bs/H_DNA.exon.down_minus.list.out.num")
H_DNA.up_minus[,Position:=Position*-1]
H_DNA.down_minus[,Position:=Position*-1]
H_DNA.TOTAL <- plot_density(H_DNA.up_plus, H_DNA.up_minus, H_DNA.down_plus, H_DNA.down_minus)
Inverted repeat
IR.up_plus <- read_dist_table("./All_non_Bs/IR.exon.down_minus.list.out.num")
IR.down_plus <- read_dist_table("./All_non_Bs/IR.exon.down_plus.list.out.num")
IR.up_minus <- read_dist_table("./All_non_Bs/IR.exon.up_minus.list.out.num")
IR.down_minus <- read_dist_table("./All_non_Bs/IR.exon.down_minus.list.out.num")
IR.up_minus[,Position:=Position*-1]
IR.down_minus[,Position:=Position*-1]
IR.TOTAL <- plot_density(IR.up_plus, IR.up_minus, IR.down_plus, IR.down_minus)
Mirror repeat
MR.up_plus <- read_dist_table("./All_non_Bs/MR.exon.down_minus.list.out.num")
MR.down_plus <- read_dist_table("./All_non_Bs/MR.exon.down_plus.list.out.num")
MR.up_minus <- read_dist_table("./All_non_Bs/MR.exon.up_minus.list.out.num")
MR.down_minus <- read_dist_table("./All_non_Bs/MR.exon.down_minus.list.out.num")
MR.up_minus[,Position:=Position*-1]
MR.down_minus[,Position:=Position*-1]
MR.TOTAL <- plot_density(MR.up_plus, MR.up_minus, MR.down_plus, MR.down_minus)
Short tandem repeat
STR.up_plus <- read_dist_table("./All_non_Bs/STR.exon.down_minus.list.out.num")
STR.down_plus <- read_dist_table("./All_non_Bs/STR.exon.down_plus.list.out.num")
STR.up_minus <- read_dist_table("./All_non_Bs/STR.exon.up_minus.list.out.num")
STR.down_minus <- read_dist_table("./All_non_Bs/STR.exon.down_minus.list.out.num")
STR.up_minus[,Position:=Position*-1]
STR.down_minus[,Position:=Position*-1]
STR.TOTAL <- plot_density(STR.up_plus, STR.up_minus, STR.down_plus, STR.down_minus)
Z-DNA
Z_DNA.up_plus <- read_dist_table("./All_non_Bs/Z_DNA.exon.down_minus.list.out.num")
Z_DNA.down_plus <- read_dist_table("./All_non_Bs/Z_DNA.exon.down_plus.list.out.num")
Z_DNA.up_minus <- read_dist_table("./All_non_Bs/Z_DNA.exon.up_minus.list.out.num")
Z_DNA.down_minus <- read_dist_table("./All_non_Bs/Z_DNA.exon.down_minus.list.out.num")
Z_DNA.up_minus[,Position:=Position*-1]
Z_DNA.down_minus[,Position:=Position*-1]
Z_DNA.TOTAL <- plot_density(Z_DNA.up_plus, Z_DNA.up_minus, Z_DNA.down_plus, Z_DNA.down_minus)
All Non-B DNA motifs
G4.TOTAL[, Non_B:="G4"]
DR.TOTAL[, Non_B:="DR"]
H_DNA.TOTAL[, Non_B:="H DNA"]
IR.TOTAL[, Non_B:="IR"]
MR.TOTAL[, Non_B:="MR"]
STR.TOTAL[, Non_B:="STR"]
Z_DNA.TOTAL[, Non_B:="Z DNA"]
Non_B.TOTAL <- rbind(G4.TOTAL, DR.TOTAL, H_DNA.TOTAL, IR.TOTAL, MR.TOTAL, STR.TOTAL, Z_DNA.TOTAL)
Fig1.A <- ggplot(Non_B.TOTAL)+
geom_line(aes(x=Position,y=Enrrichment)) +
xlim(c(-300,300)) +
facet_grid( Non_B ~ exon_pos ) +
theme_bw()
Fig1.A

Non_B.TOTAL.Enrrichment_Peak <- Non_B.TOTAL[ , .(Enrrichment_Peak=max(Enrrichment)) , by = c("Non_B", "exon_pos" )]
write.table(Non_B.TOTAL.Enrrichment_Peak, file = "./Tables/Non_B.TOTAL.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
eol = "\n", na = "NA", dec = ".", row.names = FALSE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
Distribution of non-B DNA motifs across weak and strong splice sites
We calculated the distribution of non-B DNA motifs across quartiles of splice strength, where Q1 are the weakest splice sites and Q4 are the strongest.
Merge_Qs <- function(Qs.list, window_len, strand ) {
Total_Qs <- data.table(rbindlist(Qs.list))
Q_names <- seq(nrow(Total_Qs)/window_len)
Total_Qs[, Q:=rep(Q_names, each=window_len)]
if(strand=="-"){
Total_Qs[,Position:=Position*-1]
}
Total_Qs
}
merge_plus_minus <- function(plus, minus){
TOTAL <- merge(plus, minus, by=c("Position", "Q") )
TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
TOTAL[,median:=median(Occurrences), by=c("Q")]
TOTAL[, Enrrichment:=Occurrences/median]
TOTAL[, Position:=Position-1]
}
Merge_up_down <- function(Qs.up, Qs.down){
Qs.total <- rbind(Qs.up, Qs.down)
half_n <- nrow(Qs.total)/2
Qs.total[, exon_pos:=rep(c("Upstream", "Downstream"), each=half_n) ]
Qs.total$exon_pos <- factor(Qs.total$exon_pos, levels=c("Upstream", "Downstream" ))
Qs.total$Q <- factor(Qs.total$Q)
Qs.total
}
get_total_Qs <- function(Qs.plus.up.list, Qs.minus.list, Qs.plus.down.list, Qs.minus.down.list, window_len){
Qs.plus.up <- Merge_Qs(Qs.plus.up.list, window_len, strand="+")
Qs.minus.up <- Merge_Qs(Qs.minus.list, window_len, strand="-")
Qs.up <- merge_plus_minus(Qs.plus.up, Qs.minus.up)
Qs.plus.down <- Merge_Qs(Qs.plus.down.list, window_len, strand="+")
Qs.minus.down<- Merge_Qs(Qs.minus.down.list, window_len, strand="-")
Qs.down <- merge_plus_minus(Qs.plus.down, Qs.minus.down)
Qs.total <- Merge_up_down(Qs.up, Qs.down)
Qs.total
}
G4.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_plus.q1.bed.G4.list.out.num'
G4.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_plus.q2.bed.G4.list.out.num'
G4.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_plus.q3.bed.G4.list.out.num'
G4.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_plus.q4.bed.G4.list.out.num'
G4.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_plus.q1.bed.G4.list.out.num'
G4.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_plus.q2.bed.G4.list.out.num'
G4.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_plus.q3.bed.G4.list.out.num'
G4.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_plus.q4.bed.G4.list.out.num'
G4.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_minus.q1.bed.G4.list.out.num'
G4.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_minus.q2.bed.G4.list.out.num'
G4.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_minus.q3.bed.G4.list.out.num'
G4.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.up_minus.q4.bed.G4.list.out.num'
G4.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_minus.q1.bed.G4.list.out.num'
G4.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_minus.q2.bed.G4.list.out.num'
G4.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './All_non_Bs/q1_q4/exon.down_minus.q3.bed.G4.list.out.num'
G4.Q4_down_minus <- read_dist_table(".//All_non_Bs/q1_q4/exon.down_minus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns './/All_non_Bs/q1_q4/exon.down_minus.q4.bed.G4.list.out.num'
G4.Qs.plus.up.list <- list(G4.Q1_up_plus, G4.Q2_up_plus, G4.Q3_up_plus, G4.Q4_up_plus)
G4.Qs.minus.list <- list(G4.Q1_up_minus, G4.Q2_up_minus, G4.Q3_up_minus, G4.Q4_up_minus)
G4.Qs.plus.down.list <- list(G4.Q1_down_plus, G4.Q2_down_plus, G4.Q3_down_plus, G4.Q4_down_plus)
G4.Qs.minus.down.list <- list(G4.Q1_down_minus, G4.Q2_down_minus, G4.Q3_down_minus, G4.Q4_down_minus)
G4.window_len = 2000
G4.Qs.total <- get_total_Qs(G4.Qs.plus.up.list, G4.Qs.minus.list, G4.Qs.plus.down.list, G4.Qs.minus.down.list, G4.window_len)
G4.Qs.total$Q <- mapvalues(G4.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(G4.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw()+labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

We calculated the binomial confidence intervals given the total number of exon in each quartile
hg19.nexons <- 123433 + 123936 #Number of exons found in each side
G4.Qs.total.binomial <- cbind(G4.Qs.total, G4.Qs.total[, binconf(Occurrences, hg19.nexons/4) ])
G4.Qs.total.binomial[ , median:=median(PointEst), by=c("exon_pos", "Q")]
G4.Qs.total.binomial[, `:=`(Enrrichment=PointEst/median, Enrrichment_l=Lower/median, Enrrichment_u=Upper/median)]
ggplot(G4.Qs.total.binomial)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
geom_ribbon(aes(x=Position,y=Enrrichment, fill=Q, ymin=Enrrichment_l, ymax=Enrrichment_u), alpha=0.3) +
xlim(c(-150,150)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw()+labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")
Ignoring unknown aesthetics: y

Then we explored the enrichment in other non-B DNA motifs
DR.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.DRs.list.out.num")
DR.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.DRs.list.out.num")
DR.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.DRs.list.out.num")
DR.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.DRs.list.out.num")
DR.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.DRs.list.out.num")
DR.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.DRs.list.out.num")
DR.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.DRs.list.out.num")
DR.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.DRs.list.out.num")
DR.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.DRs.list.out.num")
DR.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.DRs.list.out.num")
DR.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.DRs.list.out.num")
DR.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.DRs.list.out.num")
DR.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.DRs.list.out.num")
DR.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.DRs.list.out.num")
DR.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.DRs.list.out.num")
DR.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.DRs.list.out.num")
DR.Qs.plus.up.list <- list(DR.Q1_up_plus, DR.Q2_up_plus, DR.Q3_up_plus, DR.Q4_up_plus)
DR.Qs.minus.list <- list(DR.Q1_up_minus, DR.Q2_up_minus, DR.Q3_up_minus, DR.Q4_up_minus)
DR.Qs.plus.down.list <- list(DR.Q1_down_plus, DR.Q2_down_plus, DR.Q3_down_plus, DR.Q4_down_plus)
DR.Qs.minus.down.list <- list(DR.Q1_down_minus, DR.Q2_down_minus, DR.Q3_down_minus, DR.Q4_down_minus)
DR.window_len = 2000
DR.Qs.total <- get_total_Qs(DR.Qs.plus.up.list, DR.Qs.minus.list, DR.Qs.plus.down.list, DR.Qs.minus.down.list, DR.window_len)
H_DNA.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.H_DNA.list.out.num")
H_DNA.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.H_DNA.list.out.num")
H_DNA.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.H_DNA.list.out.num")
H_DNA.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.H_DNA.list.out.num")
H_DNA.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.H_DNA.list.out.num")
H_DNA.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.H_DNA.list.out.num")
H_DNA.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.H_DNA.list.out.num")
H_DNA.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.H_DNA.list.out.num")
H_DNA.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.H_DNA.list.out.num")
H_DNA.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.H_DNA.list.out.num")
H_DNA.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.H_DNA.list.out.num")
H_DNA.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.H_DNA.list.out.num")
H_DNA.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.H_DNA.list.out.num")
H_DNA.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.H_DNA.list.out.num")
H_DNA.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.H_DNA.list.out.num")
H_DNA.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.H_DNA.list.out.num")
H_DNA.Qs.plus.up.list <- list(H_DNA.Q1_up_plus, H_DNA.Q2_up_plus, H_DNA.Q3_up_plus, H_DNA.Q4_up_plus)
H_DNA.Qs.minus.list <- list(H_DNA.Q1_up_minus, H_DNA.Q2_up_minus, H_DNA.Q3_up_minus, H_DNA.Q4_up_minus)
H_DNA.Qs.plus.down.list <- list(H_DNA.Q1_down_plus, H_DNA.Q2_down_plus, H_DNA.Q3_down_plus, H_DNA.Q4_down_plus)
H_DNA.Qs.minus.down.list <- list(H_DNA.Q1_down_minus, H_DNA.Q2_down_minus, H_DNA.Q3_down_minus, H_DNA.Q4_down_minus)
H_DNA.window_len = 2000
H_DNA.Qs.total <- get_total_Qs(H_DNA.Qs.plus.up.list, H_DNA.Qs.minus.list, H_DNA.Qs.plus.down.list, H_DNA.Qs.minus.down.list, H_DNA.window_len)
IR.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.IRs.list.out.num")
IR.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.IRs.list.out.num")
IR.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.IRs.list.out.num")
IR.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.IRs.list.out.num")
IR.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.IRs.list.out.num")
IR.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.IRs.list.out.num")
IR.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.IRs.list.out.num")
IR.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.IRs.list.out.num")
IR.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.IRs.list.out.num")
IR.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.IRs.list.out.num")
IR.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.IRs.list.out.num")
IR.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.IRs.list.out.num")
IR.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.IRs.list.out.num")
IR.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.IRs.list.out.num")
IR.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.IRs.list.out.num")
IR.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.IRs.list.out.num")
IR.Qs.plus.up.list <- list(IR.Q1_up_plus, IR.Q2_up_plus, IR.Q3_up_plus, IR.Q4_up_plus)
IR.Qs.minus.list <- list(IR.Q1_up_minus, IR.Q2_up_minus, IR.Q3_up_minus, IR.Q4_up_minus)
IR.Qs.plus.down.list <- list(IR.Q1_down_plus, IR.Q2_down_plus, IR.Q3_down_plus, IR.Q4_down_plus)
IR.Qs.minus.down.list <- list(IR.Q1_down_minus, IR.Q2_down_minus, IR.Q3_down_minus, IR.Q4_down_minus)
IR.window_len = 2000
IR.Qs.total <- get_total_Qs(IR.Qs.plus.up.list, IR.Qs.minus.list, IR.Qs.plus.down.list, IR.Qs.minus.down.list, IR.window_len)
MR.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.MRs.list.out.num")
MR.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.MRs.list.out.num")
MR.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.MRs.list.out.num")
MR.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.MRs.list.out.num")
MR.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.MRs.list.out.num")
MR.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.MRs.list.out.num")
MR.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.MRs.list.out.num")
MR.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.MRs.list.out.num")
MR.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.MRs.list.out.num")
MR.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.MRs.list.out.num")
MR.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.MRs.list.out.num")
MR.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.MRs.list.out.num")
MR.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.MRs.list.out.num")
MR.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.MRs.list.out.num")
MR.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.MRs.list.out.num")
MR.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.MRs.list.out.num")
MR.Qs.plus.up.list <- list(MR.Q1_up_plus, MR.Q2_up_plus, MR.Q3_up_plus, MR.Q4_up_plus)
MR.Qs.minus.list <- list(MR.Q1_up_minus, MR.Q2_up_minus, MR.Q3_up_minus, MR.Q4_up_minus)
MR.Qs.plus.down.list <- list(MR.Q1_down_plus, MR.Q2_down_plus, MR.Q3_down_plus, MR.Q4_down_plus)
MR.Qs.minus.down.list <- list(MR.Q1_down_minus, MR.Q2_down_minus, MR.Q3_down_minus, MR.Q4_down_minus)
MR.window_len = 2000
MR.Qs.total <- get_total_Qs(MR.Qs.plus.up.list, MR.Qs.minus.list, MR.Qs.plus.down.list, MR.Qs.minus.down.list, MR.window_len)
STR.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.STRs.list.out.num")
STR.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.STRs.list.out.num")
STR.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.STRs.list.out.num")
STR.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.STRs.list.out.num")
STR.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.STRs.list.out.num")
STR.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.STRs.list.out.num")
STR.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.STRs.list.out.num")
STR.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.STRs.list.out.num")
STR.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.STRs.list.out.num")
STR.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.STRs.list.out.num")
STR.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.STRs.list.out.num")
STR.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.STRs.list.out.num")
STR.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.STRs.list.out.num")
STR.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.STRs.list.out.num")
STR.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.STRs.list.out.num")
STR.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.STRs.list.out.num")
STR.Qs.plus.up.list <- list(STR.Q1_up_plus, STR.Q2_up_plus, STR.Q3_up_plus, STR.Q4_up_plus)
STR.Qs.minus.list <- list(STR.Q1_up_minus, STR.Q2_up_minus, STR.Q3_up_minus, STR.Q4_up_minus)
STR.Qs.plus.down.list <- list(STR.Q1_down_plus, STR.Q2_down_plus, STR.Q3_down_plus, STR.Q4_down_plus)
STR.Qs.minus.down.list <- list(STR.Q1_down_minus, STR.Q2_down_minus, STR.Q3_down_minus, STR.Q4_down_minus)
STR.window_len = 2000
STR.Qs.total <- get_total_Qs(STR.Qs.plus.up.list, STR.Qs.minus.list, STR.Qs.plus.down.list, STR.Qs.minus.down.list, STR.window_len)
Z_DNA.Q1_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q1.bed.Z_DNA.list.out.num")
Z_DNA.Q2_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q2.bed.Z_DNA.list.out.num")
Z_DNA.Q3_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q3.bed.Z_DNA.list.out.num")
Z_DNA.Q4_up_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_plus.q4.bed.Z_DNA.list.out.num")
Z_DNA.Q1_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q1.bed.Z_DNA.list.out.num")
Z_DNA.Q2_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q2.bed.Z_DNA.list.out.num")
Z_DNA.Q3_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q3.bed.Z_DNA.list.out.num")
Z_DNA.Q4_down_plus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_plus.q4.bed.Z_DNA.list.out.num")
Z_DNA.Q1_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q1.bed.Z_DNA.list.out.num")
Z_DNA.Q2_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q2.bed.Z_DNA.list.out.num")
Z_DNA.Q3_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q3.bed.Z_DNA.list.out.num")
Z_DNA.Q4_up_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.up_minus.q4.bed.Z_DNA.list.out.num")
Z_DNA.Q1_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q1.bed.Z_DNA.list.out.num")
Z_DNA.Q2_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q2.bed.Z_DNA.list.out.num")
Z_DNA.Q3_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q3.bed.Z_DNA.list.out.num")
Z_DNA.Q4_down_minus <- read_dist_table("./All_non_Bs/q1_q4/exon.down_minus.q4.bed.Z_DNA.list.out.num")
Z_DNA.Qs.plus.up.list <- list(Z_DNA.Q1_up_plus, Z_DNA.Q2_up_plus, Z_DNA.Q3_up_plus, Z_DNA.Q4_up_plus)
Z_DNA.Qs.minus.list <- list(Z_DNA.Q1_up_minus, Z_DNA.Q2_up_minus, Z_DNA.Q3_up_minus, Z_DNA.Q4_up_minus)
Z_DNA.Qs.plus.down.list <- list(Z_DNA.Q1_down_plus, Z_DNA.Q2_down_plus, Z_DNA.Q3_down_plus, Z_DNA.Q4_down_plus)
Z_DNA.Qs.minus.down.list <- list(Z_DNA.Q1_down_minus, Z_DNA.Q2_down_minus, Z_DNA.Q3_down_minus, Z_DNA.Q4_down_minus)
Z_DNA.window_len = 2000
Z_DNA.Qs.total <- get_total_Qs(Z_DNA.Qs.plus.up.list, Z_DNA.Qs.minus.list, Z_DNA.Qs.plus.down.list, Z_DNA.Qs.minus.down.list, Z_DNA.window_len)
G4.Qs.total[, Non_B:="G4"]
DR.Qs.total[, Non_B:="DR"]
H_DNA.Qs.total[, Non_B:="H-DNA"]
IR.Qs.total[, Non_B:="IR"]
MR.Qs.total[, Non_B:="MR"]
STR.Qs.total[, Non_B:="STR"]
Z_DNA.Qs.total[, Non_B:="Z-DNA"]
Non_B.Qs.TOTAL <- rbind(G4.Qs.total, DR.Qs.total, H_DNA.Qs.total, IR.Qs.total, MR.Qs.total, STR.Qs.total, Z_DNA.Qs.total)
Non_B.Qs.TOTAL$Q <- mapvalues(Non_B.Qs.TOTAL$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(Non_B.Qs.TOTAL)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( Non_B ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

Non_B.Qs.TOTAL.Enrrichment_Peak <- Non_B.Qs.TOTAL[ , .(Enrrichment_Peak=max(Enrrichment)) , by= c("Non_B", "exon_pos", "Q")]
write.table(Non_B.Qs.TOTAL.Enrrichment_Peak, file = "./Tables/Non_B.Qs.TOTAL.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
eol = "\n", na = "NA", dec = ".", row.names = FALSE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
Template - non template
To investigate if the distribution of non-B DNA motifs is biased by transcription direction, we generate .num files where the counts were separated by template and non templated strands:
- Template = plus_minus, minus_plus
- Non-template = minus_minus, plus_plus
G4.template.Q1_up_plus <- read_dist_table("./template_non_template/exon.up_plus.q1.bed.G4s_minus_plus.list.final.num")
G4.template.Q2_up_plus <- read_dist_table("./template_non_template/exon.up_plus.q2.bed.G4s_minus_plus.list.final.num")
G4.template.Q3_up_plus <- read_dist_table("./template_non_template/exon.up_plus.q3.bed.G4s_minus_plus.list.final.num")
G4.template.Q4_up_plus <- read_dist_table("./template_non_template/exon.up_plus.q4.bed.G4s_minus_plus.list.final.num")
G4.template.Q1_up_minus <- read_dist_table("./template_non_template/exon.up_minus.q1.bed.G4s_plus_minus.list.final.num")
G4.template.Q2_up_minus <- read_dist_table("./template_non_template/exon.up_minus.q2.bed.G4s_plus_minus.list.final.num")
G4.template.Q3_up_minus <- read_dist_table("./template_non_template/exon.up_minus.q3.bed.G4s_plus_minus.list.final.num")
G4.template.Q4_up_minus <- read_dist_table("./template_non_template/exon.up_minus.q4.bed.G4s_plus_minus.list.final.num")
G4.template.Q1_down_plus <- read_dist_table("./template_non_template/exon.down_plus.q1.bed.G4s_minus_plus.list.final.num")
G4.template.Q2_down_plus <- read_dist_table("./template_non_template/exon.down_plus.q2.bed.G4s_minus_plus.list.final.num")
G4.template.Q3_down_plus <- read_dist_table("./template_non_template/exon.down_plus.q3.bed.G4s_minus_plus.list.final.num")
G4.template.Q4_down_plus <- read_dist_table("./template_non_template/exon.down_plus.q4.bed.G4s_minus_plus.list.final.num")
G4.template.Q1_down_minus <- read_dist_table("./template_non_template/exon.down_minus.q1.bed.G4s_plus_minus.list.final.num")
G4.template.Q2_down_minus <- read_dist_table("./template_non_template/exon.down_minus.q2.bed.G4s_plus_minus.list.final.num")
G4.template.Q3_down_minus <- read_dist_table("./template_non_template/exon.down_minus.q3.bed.G4s_plus_minus.list.final.num")
G4.template.Q4_down_minus <- read_dist_table("./template_non_template/exon.down_minus.q4.bed.G4s_plus_minus.list.final.num")
G4.non_template.Q1_up_plus <- read_dist_table("./template_non_template/exon.up_plus.q1.bed.G4s_plus_plus.list.final.num")
G4.non_template.Q2_up_plus <- read_dist_table("./template_non_template/exon.up_plus.q2.bed.G4s_plus_plus.list.final.num")
G4.non_template.Q3_up_plus <- read_dist_table("./template_non_template/exon.up_plus.q3.bed.G4s_plus_plus.list.final.num")
G4.non_template.Q4_up_plus <- read_dist_table("./template_non_template/exon.up_plus.q4.bed.G4s_plus_plus.list.final.num")
G4.non_template.Q1_up_minus <- read_dist_table("./template_non_template/exon.up_minus.q1.bed.G4s_minus_minus.list.final.num")
G4.non_template.Q2_up_minus <- read_dist_table("./template_non_template/exon.up_minus.q2.bed.G4s_minus_minus.list.final.num")
G4.non_template.Q3_up_minus <- read_dist_table("./template_non_template/exon.up_minus.q3.bed.G4s_minus_minus.list.final.num")
G4.non_template.Q4_up_minus <- read_dist_table("./template_non_template/exon.up_minus.q4.bed.G4s_minus_minus.list.final.num")
G4.non_template.Q1_down_plus <- read_dist_table("./template_non_template/exon.down_plus.q1.bed.G4s_plus_plus.list.final.num")
G4.non_template.Q2_down_plus <- read_dist_table("./template_non_template/exon.down_plus.q2.bed.G4s_plus_plus.list.final.num")
G4.non_template.Q3_down_plus <- read_dist_table("./template_non_template/exon.down_plus.q3.bed.G4s_plus_plus.list.final.num")
G4.non_template.Q4_down_plus <- read_dist_table("./template_non_template/exon.down_plus.q4.bed.G4s_plus_plus.list.final.num")
G4.non_template.Q1_down_minus <- read_dist_table("./template_non_template/exon.down_minus.q1.bed.G4s_minus_minus.list.final.num")
G4.non_template.Q2_down_minus <- read_dist_table("./template_non_template/exon.down_minus.q2.bed.G4s_minus_minus.list.final.num")
G4.non_template.Q3_down_minus <- read_dist_table("./template_non_template/exon.down_minus.q3.bed.G4s_minus_minus.list.final.num")
G4.non_template.Q4_down_minus <- read_dist_table("./template_non_template/exon.down_minus.q4.bed.G4s_minus_minus.list.final.num")
G4.template.Qs.plus.up.list <- list(G4.template.Q1_up_plus, G4.template.Q2_up_plus, G4.template.Q3_up_plus, G4.template.Q4_up_plus)
G4.template.Qs.minus.list <- list(G4.template.Q1_up_minus, G4.template.Q2_up_minus, G4.template.Q3_up_minus, G4.template.Q4_up_minus)
G4.template.Qs.plus.down.list <- list(G4.template.Q1_down_plus, G4.template.Q2_down_plus, G4.template.Q3_down_plus, G4.template.Q4_down_plus)
G4.template.Qs.minus.down.list <- list(G4.template.Q1_down_minus, G4.template.Q2_down_minus, G4.template.Q3_down_minus, G4.template.Q4_down_minus)
G4.template.window_len = 2000
G4.template.Qs.total <- get_total_Qs(G4.template.Qs.plus.up.list, G4.template.Qs.minus.list, G4.template.Qs.plus.down.list, G4.template.Qs.minus.down.list, G4.template.window_len)
G4.non_template.Qs.plus.up.list <- list(G4.non_template.Q1_up_plus, G4.non_template.Q2_up_plus, G4.non_template.Q3_up_plus, G4.non_template.Q4_up_plus)
G4.non_template.Qs.minus.list <- list(G4.non_template.Q1_up_minus, G4.non_template.Q2_up_minus, G4.non_template.Q3_up_minus, G4.non_template.Q4_up_minus)
G4.non_template.Qs.plus.down.list <- list(G4.non_template.Q1_down_plus, G4.non_template.Q2_down_plus, G4.non_template.Q3_down_plus, G4.non_template.Q4_down_plus)
G4.non_template.Qs.minus.down.list <- list(G4.non_template.Q1_down_minus, G4.non_template.Q2_down_minus, G4.non_template.Q3_down_minus, G4.non_template.Q4_down_minus)
G4.non_template.window_len = 2000
G4.non_template.Qs.total <- get_total_Qs(G4.non_template.Qs.plus.up.list, G4.non_template.Qs.minus.list, G4.non_template.Qs.plus.down.list, G4.non_template.Qs.minus.down.list, G4.template.window_len)
G4.template.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 147 179 0.8212291 152 175 0.8685714 299 351 0.8518519 Upstream
2: -1000 2 126 134 0.9402985 141 135 1.0444444 267 268 0.9962687 Upstream
3: -1000 3 100 99 1.0101010 94 94 1.0000000 194 192 1.0104167 Upstream
4: -1000 4 63 66 0.9545455 74 65 1.1384615 137 131 1.0458015 Upstream
5: -999 1 149 179 0.8324022 150 175 0.8571429 299 351 0.8518519 Upstream
---
15988: 997 4 99 108 0.9166667 104 104 1.0000000 203 211 0.9620853 Downstream
15989: 998 1 119 137 0.8686131 111 129 0.8604651 230 266 0.8646617 Downstream
15990: 998 2 109 128 0.8515625 117 127 0.9212598 226 252 0.8968254 Downstream
15991: 998 3 106 110 0.9636364 109 109 1.0000000 215 217 0.9907834 Downstream
15992: 998 4 96 108 0.8888889 104 104 1.0000000 200 211 0.9478673 Downstream
G4.non_template.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 193 202 0.9554455 174 200 0.8700000 367 406 0.9039409 Upstream
2: -1000 2 148 161 0.9192547 120 149 0.8053691 268 309 0.8673139 Upstream
3: -1000 3 124 122 1.0163934 113 108 1.0462963 237 229 1.0349345 Upstream
4: -1000 4 84 74 1.1351351 70 70 1.0000000 154 144 1.0694444 Upstream
5: -999 1 193 202 0.9554455 177 200 0.8850000 370 406 0.9113300 Upstream
---
15988: 997 4 102 114 0.8947368 99 109 0.9082569 201 225 0.8933333 Downstream
15989: 998 1 123 154 0.7987013 128 136 0.9411765 251 289 0.8685121 Downstream
15990: 998 2 128 147 0.8707483 114 139 0.8201439 242 288 0.8402778 Downstream
15991: 998 3 108 125 0.8640000 90 122 0.7377049 198 249 0.7951807 Downstream
15992: 998 4 98 114 0.8596491 99 109 0.9082569 197 225 0.8755556 Downstream
G4.template_non_template.Qs.total <- rbind(G4.template.Qs.total, G4.non_template.Qs.total)
half_n <- nrow(G4.template_non_template.Qs.total)/2
G4.template_non_template.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4.template_non_template.Qs.total$Strand <- factor(G4.template_non_template.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4.template_non_template.Qs.total$Q <- mapvalues(G4.template_non_template.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4.template_non_template.Qs.total.binomial <- cbind(G4.template_non_template.Qs.total, G4.template_non_template.Qs.total[, binconf(Occurrences, hg19.nexons/8) ])
G4.template_non_template.Qs.total.binomial[, median:=NULL]
G4.template_non_template.Qs.total.binomial[ , median:=median(PointEst), by=c("exon_pos", "Q", "Strand")]
G4.template_non_template.Qs.total.binomial[, `:=`(Enrrichment=PointEst/median, Enrrichment_l=Lower/median, Enrrichment_u=Upper/median)]
Fig2.A <- ggplot(G4.template_non_template.Qs.total.binomial)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
geom_ribbon(aes(x=Position, fill=Q, ymin=Enrrichment_l, ymax=Enrrichment_u), alpha=0.3) +
xlim(c(-150,150)) +
facet_grid( Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
Fig2.A

G4.template_non_template.total <- G4.template_non_template.Qs.total[ , .(Occurrences=sum(Occurrences)) , by=c("Strand", "exon_pos", "Position")]
G4.template_non_template.total[ , median:=median(Occurrences) , by=c("Strand", "exon_pos")]
G4.template_non_template.total[ , Enrrichment:=Occurrences/median , by=c("Strand", "exon_pos", "Position")]
ggplot(G4.template_non_template.total)+
geom_line(aes(x=Position,y=Enrrichment)) +
xlim(c(-150,150)) +
facet_grid( Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

G4.template_non_template.total_Peak <- G4.template_non_template.total[ , .(Enrrichment_Peak=max(Enrrichment)) , by= c("Strand", "exon_pos")]
write.table(G4.template_non_template.total_Peak, file = "./Tables/G4.template_non_template.total_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
eol = "\n", na = "NA", dec = ".", row.names = FALSE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
G4.template_non_template.Qs.total.Enrrichment_Peak <- G4.template_non_template.Qs.total[ , .(Enrrichment_Peak=max(Enrrichment)) , by= c( "exon_pos", "Q", "Strand" )]
write.table(G4.template_non_template.Qs.total.Enrrichment_Peak, file = "./Tables/G4.template_non_template.Qs.total.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
eol = "\n", na = "NA", dec = ".", row.names = FALSE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
G4 RUNS
Here we explored the enrichment of G-quadruplexes with different G-run length
G1_up_plus <- read_dist_table("./G4_runs/exon.up_plus.bed.Single_G_runs.list.out.num")
G2_up_plus <- read_dist_table("./G4_runs/exon.up_plus.bed.Twice_G_runs.list.out.num")
G3_up_plus <- read_dist_table("./G4_runs/exon.up_plus.bed.Three_G_runs.list.out.num")
G4_up_plus <- read_dist_table("./G4_runs/exon.up_plus.bed.Four_G_runs.list.out.num")
G5_up_plus <- read_dist_table("./G4_runs/exon.up_plus.bed.Five_G_runs.list.out.num")
G6_up_plus <- read_dist_table("./G4_runs/exon.up_plus.bed.Six_G_runs.list.out.num")
G1_up_minus <- read_dist_table("./G4_runs/exon.up_minus.bed.Single_G_runs.list.out.num")
G2_up_minus <- read_dist_table("./G4_runs/exon.up_minus.bed.Twice_G_runs.list.out.num")
G3_up_minus <- read_dist_table("./G4_runs/exon.up_minus.bed.Three_G_runs.list.out.num")
G4_up_minus <- read_dist_table("./G4_runs/exon.up_minus.bed.Four_G_runs.list.out.num")
G5_up_minus <- read_dist_table("./G4_runs/exon.up_minus.bed.Five_G_runs.list.out.num")
G6_up_minus <- read_dist_table("./G4_runs/exon.up_minus.bed.Six_G_runs.list.out.num")
G1_down_plus <- read_dist_table("./G4_runs/exon.down_plus.bed.Single_G_runs.list.out.num")
G2_down_plus <- read_dist_table("./G4_runs/exon.down_plus.bed.Twice_G_runs.list.out.num")
G3_down_plus <- read_dist_table("./G4_runs/exon.down_plus.bed.Three_G_runs.list.out.num")
G4_down_plus <- read_dist_table("./G4_runs/exon.down_plus.bed.Four_G_runs.list.out.num")
G5_down_plus <- read_dist_table("./G4_runs/exon.down_plus.bed.Five_G_runs.list.out.num")
G6_down_plus <- read_dist_table("./G4_runs/exon.down_plus.bed.Six_G_runs.list.out.num")
G1_down_minus <- read_dist_table("./G4_runs/exon.down_minus.bed.Single_G_runs.list.out.num")
G2_down_minus <- read_dist_table("./G4_runs/exon.down_minus.bed.Twice_G_runs.list.out.num")
G3_down_minus <- read_dist_table("./G4_runs/exon.down_minus.bed.Three_G_runs.list.out.num")
G4_down_minus <- read_dist_table("./G4_runs/exon.down_minus.bed.Four_G_runs.list.out.num")
G5_down_minus <- read_dist_table("./G4_runs/exon.down_minus.bed.Five_G_runs.list.out.num")
G6_down_minus <- read_dist_table("./G4_runs/exon.down_minus.bed.Six_G_runs.list.out.num")
Gruns.up_plus.list <- list(G1_up_plus, G2_up_plus, G3_up_plus, G4_up_plus, G5_up_plus, G6_up_plus)
Gruns.up_minus.list <- list(G1_up_minus, G2_up_minus, G3_up_minus, G4_up_minus, G5_up_minus, G6_up_minus)
Gruns.down_plus.list <- list(G1_down_plus, G2_down_plus, G3_down_plus, G4_down_plus, G5_down_plus, G6_down_plus)
Gruns.down_minus.list <- list(G1_down_minus, G2_down_minus, G3_down_minus, G4_down_minus, G5_down_minus, G6_down_minus)
Gruns.window_len = 2000
Gruns.total <- get_total_Qs(Gruns.up_plus.list, Gruns.up_minus.list, Gruns.down_plus.list, Gruns.down_minus.list, Gruns.window_len)
Gruns.total[, G_run_length:=Q]
Gruns.total.binomial <- cbind(Gruns.total, Gruns.total[, binconf(Occurrences, hg19.nexons) ])
Gruns.total.binomial[, median:=NULL]
Gruns.total.binomial[ , median:=median(PointEst), by=c("exon_pos", "Q" )]
Gruns.total.binomial[, `:=`(Enrrichment=PointEst/median, Enrrichment_l=Lower/median, Enrrichment_u=Upper/median)]
Fig2.B <- ggplot(Gruns.total.binomial)+
geom_line(aes(x=Position,y=Enrrichment, colour=G_run_length)) +
geom_ribbon(aes(x=Position, fill=Q, ymin=Enrrichment_l, ymax=Enrrichment_u), alpha=0.3) +
xlim(c(-100,100)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw() +
labs(colour = "Number of consecutive G-runs") +
theme(legend.position = "top", legend.direction = "horizontal")
Fig2.B

Gruns.total.Enrrichment_Peak <- Gruns.total[ , .(Enrrichment_Peak=max(Enrrichment)) , by= c( "exon_pos", "G_run_length")]
write.table(Gruns.total.Enrrichment_Peak, file = "./Tables/Gruns.total.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
eol = "\n", na = "NA", dec = ".", row.names = FALSE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
G4 enrichment across evolution
We analyzed the G4 enrichment across splice sites from different species
susScr11.up_plus <- read_dist_table("./Evolution/susScr11.exon.up_plus.bed.score.susScr11.txt..list.out.num")
susScr11.down_plus <- read_dist_table("./Evolution/susScr11.exon.down_plus.bed.score.susScr11.txt..list.out.num")
susScr11.up_minus <- read_dist_table("./Evolution/susScr11.exon.up_minus.bed.score.susScr11.txt..list.out.num")
susScr11.down_minus <- read_dist_table("./Evolution/susScr11.exon.down_minus.bed.score.susScr11.txt..list.out.num")
susScr11.up_minus[,Position:=Position*-1]
susScr11.down_minus[,Position:=Position*-1]
susScr11.TOTAL <- plot_density(susScr11.up_plus, susScr11.up_minus, susScr11.down_plus, susScr11.down_minus)
TAIR10.up_plus <- read_dist_table("./Evolution/TAIR10.exon.up_plus.bed.score.TAIR10.txt..list.out.num")
TAIR10.down_plus <- read_dist_table("./Evolution/TAIR10.exon.down_plus.bed.score.TAIR10.txt..list.out.num")
TAIR10.up_minus <- read_dist_table("./Evolution/TAIR10.exon.up_minus.bed.score.TAIR10.txt..list.out.num")
TAIR10.down_minus <- read_dist_table("./Evolution/TAIR10.exon.down_minus.bed.score.TAIR10.txt..list.out.num")
TAIR10.up_minus[,Position:=Position*-1]
TAIR10.down_minus[,Position:=Position*-1]
TAIR10.TOTAL <- plot_density(TAIR10.up_plus, TAIR10.up_minus, TAIR10.down_plus, TAIR10.down_minus)
anoCar2.up_plus <- read_dist_table("./Evolution/anoCar2.exon.up_plus.bed.score.anoCar2.txt..list.out.num")
anoCar2.down_plus <- read_dist_table("./Evolution/anoCar2.exon.down_plus.bed.score.anoCar2.txt..list.out.num")
anoCar2.up_minus <- read_dist_table("./Evolution/anoCar2.exon.up_minus.bed.score.anoCar2.txt..list.out.num")
anoCar2.down_minus <- read_dist_table("./Evolution/anoCar2.exon.down_minus.bed.score.anoCar2.txt..list.out.num")
anoCar2.up_minus[,Position:=Position*-1]
anoCar2.down_minus[,Position:=Position*-1]
anoCar2.TOTAL <- plot_density(anoCar2.up_plus, anoCar2.up_minus, anoCar2.down_plus, anoCar2.down_minus)
xenTro9.up_plus <- read_dist_table("./Evolution/xenTro9.exon.up_plus.bed.score.xenTro9.txt..list.out.num")
xenTro9.down_plus <- read_dist_table("./Evolution/xenTro9.exon.down_plus.bed.score.xenTro9.txt..list.out.num")
xenTro9.up_minus <- read_dist_table("./Evolution/xenTro9.exon.up_minus.bed.score.xenTro9.txt..list.out.num")
xenTro9.down_minus <- read_dist_table("./Evolution/xenTro9.exon.down_minus.bed.score.xenTro9.txt..list.out.num")
xenTro9.up_minus[,Position:=Position*-1]
xenTro9.down_minus[,Position:=Position*-1]
xenTro9.TOTAL <- plot_density(xenTro9.up_plus, xenTro9.up_minus, xenTro9.down_plus, xenTro9.down_minus)
ce10.up_plus <- read_dist_table("./Evolution/ce10.exon.up_plus.bed.score.ce10.txt..list.out.num")
ce10.down_plus <- read_dist_table("./Evolution/ce10.exon.down_plus.bed.score.ce10.txt..list.out.num")
ce10.up_minus <- read_dist_table("./Evolution/ce10.exon.up_minus.bed.score.ce10.txt..list.out.num")
ce10.down_minus <- read_dist_table("./Evolution/ce10.exon.down_minus.bed.score.ce10.txt..list.out.num")
ce10.up_minus[,Position:=Position*-1]
ce10.down_minus[,Position:=Position*-1]
ce10.TOTAL <- plot_density(ce10.up_plus, ce10.up_minus, ce10.down_plus, ce10.down_minus)
danRer11.up_plus <- read_dist_table("./Evolution/danRer11.exon.up_plus.bed.score.danRer11.txt..list.out.num")
danRer11.down_plus <- read_dist_table("./Evolution/danRer11.exon.down_plus.bed.score.danRer11.txt..list.out.num")
danRer11.up_minus <- read_dist_table("./Evolution/danRer11.exon.up_minus.bed.score.danRer11.txt..list.out.num")
danRer11.down_minus <- read_dist_table("./Evolution/danRer11.exon.down_minus.bed.score.danRer11.txt..list.out.num")
Error: vector memory exhausted (limit reached?)
mm10.up_plus <- read_dist_table("./Evolution/mm10.exon.up_plus.bed.score.mm10.txt..list.out.num")
mm10.down_plus <- read_dist_table("./Evolution/mm10.exon.down_plus.bed.score.mm10.txt..list.out.num")
mm10.up_minus <- read_dist_table("./Evolution/mm10.exon.up_minus.bed.score.mm10.txt..list.out.num")
mm10.down_minus <- read_dist_table("./Evolution/mm10.exon.down_minus.bed.score.mm10.txt..list.out.num")
mm10.up_minus[,Position:=Position*-1]
mm10.down_minus[,Position:=Position*-1]
mm10.TOTAL <- plot_density(mm10.up_plus, mm10.up_minus, mm10.down_plus, mm10.down_minus)
hg19.up_plus <- read_dist_table("./Evolution/hg19.exon.up_plus.bed.score.hg19.txt..list.out.num")
hg19.down_plus <- read_dist_table("./Evolution/hg19.exon.down_plus.bed.score.hg19.txt..list.out.num")
hg19.up_minus <- read_dist_table("./Evolution/hg19.exon.up_minus.bed.score.hg19.txt..list.out.num")
hg19.down_minus <- read_dist_table("./Evolution/hg19.exon.down_minus.bed.score.hg19.txt..list.out.num")
hg19.up_minus[,Position:=Position*-1]
hg19.down_minus[,Position:=Position*-1]
hg19.TOTAL <- plot_density(hg19.up_plus, hg19.up_minus, hg19.down_plus, hg19.down_minus)
dm6.up_plus <- read_dist_table("./Evolution/dm6.exon.up_plus.bed.score.dm6.txt..list.out.num")
dm6.down_plus <- read_dist_table("./Evolution/dm6.exon.down_plus.bed.score.dm6.txt..list.out.num")
dm6.up_minus <- read_dist_table("./Evolution/dm6.exon.up_minus.bed.score.dm6.txt..list.out.num")
dm6.down_minus <- read_dist_table("./Evolution/dm6.exon.down_minus.bed.score.dm6.txt..list.out.num")
dm6.up_minus[,Position:=Position*-1]
dm6.down_minus[,Position:=Position*-1]
dm6.TOTAL <- plot_density(dm6.up_plus, dm6.up_minus, dm6.down_plus, dm6.down_minus)
galGal5.up_plus <- read_dist_table("./Evolution/galGal5.exon.up_plus.bed.score.galGal5.txt..list.out.num")
galGal5.down_plus <- read_dist_table("./Evolution/galGal5.exon.down_plus.bed.score.galGal5.txt..list.out.num")
galGal5.up_minus <- read_dist_table("./Evolution/galGal5.exon.up_minus.bed.score.galGal5.txt..list.out.num")
galGal5.down_minus <- read_dist_table("./Evolution/galGal5.exon.down_minus.bed.score.galGal5.txt..list.out.num")
galGal5.up_minus[,Position:=Position*-1]
galGal5.down_minus[,Position:=Position*-1]
galGal5.TOTAL <- plot_density(galGal5.up_plus, galGal5.up_minus, galGal5.down_plus, galGal5.down_minus)
sacCer.up_plus <- read_dist_table("./Evolution/sacCer3.exon.up_plus.bed.score.sacCer3.txt..list.out.num")
sacCer.down_plus <- read_dist_table("./Evolution/sacCer3.exon.down_plus.bed.score.sacCer3.txt..list.out.num")
sacCer.up_minus <- read_dist_table("./Evolution/sacCer3.exon.up_minus.bed.score.sacCer3.txt..list.out.num")
sacCer.down_minus <- read_dist_table("./Evolution/sacCer3.exon.down_minus.bed.score.sacCer3.txt..list.out.num")
sacCer.up_minus[,Position:=Position*-1]
sacCer.down_minus[,Position:=Position*-1]
sacCer.TOTAL <- plot_density(sacCer.up_plus, sacCer.up_minus, sacCer.down_plus, sacCer.down_minus)
ce10.TOTAL[, species:="C. elegans"]
hg19.TOTAL[, species:="H. sapiens"]
mm10.TOTAL[, species:="M. musculus"]
danRer11.TOTAL[, species:="D. rerio"]
dm6.TOTAL[, species:="D. melanogaster"]
galGal5.TOTAL[, species:="G. gallus"]
sacCer.TOTAL[, species:="S. cerevisiae"]
xenTro9.TOTAL[ , species:="X. tropicalis" ]
anoCar2.TOTAL[ , species:="A. carolinensis" ]
TAIR10.TOTAL[ , species:="A. thaliana" ]
susScr11.TOTAL[ , species:="S. scrofa"]
All.species.TOTAL <- rbind(hg19.TOTAL, mm10.TOTAL, galGal5.TOTAL, danRer11.TOTAL, anoCar2.TOTAL, xenTro9.TOTAL, susScr11.TOTAL )
#All.species.TOTAL.binomial <- cbind(All.species.TOTAL, Gruns.total[, binconf(Occurrences, hg19.nexons) ])
#All.species.TOTAL.binomial[, median:=NULL]
#All.species.TOTAL.binomial[ , median:=median(PointEst), by=c("exon_pos", "species" )]
#All.species.TOTAL.binomial[, `:=`(Enrrichment=PointEst/median, Enrrichment_l=Lower/median, Enrrichment_u=Upper/median)]
Fig6.B <- ggplot(All.species.TOTAL)+
geom_line(aes(x=Position,y=Enrrichment, color=species)) +
# geom_ribbon(aes(x=Position, fill=species, ymin=Enrrichment_l, ymax=Enrrichment_u), alpha=0.3) +
xlim(c(-300,300)) +
facet_grid( . ~ exon_pos ) +
theme(plot.title = element_text(hjust = 0.5)) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
Fig6.B

We plot other species that did not show strong enrichment by separate
All.species.TOTAL <- rbind(ce10.TOTAL, dm6.TOTAL, TAIR10.TOTAL )
ggplot(All.species.TOTAL)+
geom_line(aes(x=Position,y=Enrrichment, color=species)) +
xlim(c(-300,300)) +
ggtitle( "Non-vertebrates") +
facet_grid( . ~ exon_pos ) +
theme(plot.title = element_text(hjust = 0.5)) +
theme_bw()

G4 and gene structure
Flanking intron size
Here we analized the intron size of distribution of exon which are flanked by G4 (on an 100nt window)
intron_size_upstream_non_template <- rbind(fread('./Intron_size/Introns.hg19_upstream_100nt_window.bed.plus_strand_genome.plus_G4s'),
fread('./Intron_size/Introns.hg19_upstream_100nt_window.bed.minus_strand_genome.minus_G4s'))
intron_size_downstream_non_template <- rbind(fread('./Intron_size/Introns.hg19_downstream_100nt_window.bed.plus_strand_genome.plus_G4s'),
fread('./Intron_size/Introns.hg19_downstream_100nt_window.bed.minus_strand_genome.minus_G4s'))
intron_size_upstream_template <- rbind(fread('./Intron_size/Introns.hg19_upstream_100nt_window.bed.plus_strand_genome.minus_G4s'),
fread('./Intron_size/Introns.hg19_upstream_100nt_window.bed.minus_strand_genome.plus_G4s'))
intron_size_downstream_template <- rbind(fread('./Intron_size/Introns.hg19_downstream_100nt_window.bed.minus_strand_genome.plus_G4s'),
fread('./Intron_size/Introns.hg19_downstream_100nt_window.bed.plus_strand_genome.minus_G4s'))
intron_size_upstream_non_template[ , `:=`(exon_pos="upstream", strand="non_template") ]
intron_size_downstream_non_template[ , `:=`(exon_pos="downstream", strand="non_template") ]
intron_size_upstream_template[ , `:=`(exon_pos="upstream", strand="template") ]
intron_size_downstream_template[ , `:=`(exon_pos="downstream", strand="template") ]
intron_size_TOTAL <- rbind(intron_size_upstream_non_template, intron_size_downstream_non_template, intron_size_upstream_template, intron_size_downstream_template )
colnames(intron_size_TOTAL) <- c("chrom", "start", "end", "strand", "intron_number", "intron_size", "Transcript", "G4", "exon_pos", "Strand" )
intron_size_TOTAL[ G4>0, G4_type:="With G4" ]
intron_size_TOTAL[ G4==0, G4_type:="Without G4" ]
intron_size_TOTAL$exon_pos <- factor(intron_size_TOTAL$exon_pos, levels=c("upstream", "downstream"))
Fig3.A <- ggplot(data=intron_size_TOTAL) +
geom_boxplot( aes(x=G4_type, y=log10(intron_size) ) ) +
facet_grid( . ~ exon_pos ) +
xlab("")+
ylab("log10(Intron size)") +
theme_bw()
Fig3.A


short_introns[, type:="Short"]
long_introns[, type:="Long"]
long_introns$type <- factor(long_introns$type, levels=c("Short", "Long"))
long_short_introns <- rbind(long_introns, short_introns)
ggplot(long_short_introns) +
geom_violin(aes( type, i.GC))
ggplot(long_short_introns) +
geom_bar(aes(x=type, fill=((G4.3ss | G4.5ss) ), stat="count" ))
Ignoring unknown aesthetics: stat

short_long.odd_ratios <- c()
short_long.pvalues<- c()
short_long.long.fraq <- c()
short_long.short.fraq <- c()
short_long.GCs <- data.table()
for (i in seq(1, length(i.mins))) {
i.min = i.mins[i]
i.max = i.maxs[i]
long_introns.int <- long_introns[i.id %in% long_short_correspondence_35K[s.len>i.min & s.len<=i.max , l.id]]
short_introns.int <- short_introns[i.id %in% long_short_correspondence_35K[s.len>i.min & s.len<=i.max, s.id]]
long_short.int.2x2 <- matrix(nrow = 2, c(nrow(long_introns.int[(!G4.3ss & !G4.5ss), ]),
nrow(short_introns.int[(!G4.3ss & !G4.5ss), ]),
nrow(long_introns.int[(G4.3ss | G4.5ss), ]),
nrow(short_introns.int[(G4.3ss | G4.5ss), ]) ))
odd.ratio <- (long_short.int.2x2[2,2] / long_short.int.2x2[2,1] ) / (long_short.int.2x2[1,2] / long_short.int.2x2[1,1])
long.frac <- (long_short.int.2x2[1,2] / long_short.int.2x2[1,1])
short.frac <- (long_short.int.2x2[2,2] / long_short.int.2x2[2,1] )
print(odd.ratio)
print(chisq.test(long_short.int.2x2))
short_long.odd_ratios <- c(short_long.odd_ratios, odd.ratio)
short_long.pvalues <- c(short_long.pvalues, chisq.test(long_short.int.2x2)$p.value * length(i.mins))
short_long.short.fraq <- c(short_long.short.fraq, short.frac)
short_long.long.fraq <- c(short_long.long.fraq, long.frac)
short_long.GCs <- rbind( short_long.GCs, short_introns.int[ , .(i.id, i.GC, G4, type="Short", i.min=i.min, i.max=i.max )] )
short_long.GCs <- rbind( short_long.GCs, long_introns.int[ , .(i.id, i.GC, G4, type="Long", i.min=i.min, i.max=i.max )] )
}
[1] 0.8138132
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 9.4403, df = 1, p-value = 0.002123
[1] 1.064866
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 0.81801, df = 1, p-value = 0.3658
[1] 0.7789226
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 8.7143, df = 1, p-value = 0.003157
[1] 0.9686031
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 0.10585, df = 1, p-value = 0.7449
[1] 0.7346991
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 10.563, df = 1, p-value = 0.001154
[1] 0.8126509
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 4.5242, df = 1, p-value = 0.03342
[1] 0.8175824
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 3.3907, df = 1, p-value = 0.06556
[1] 0.8382815
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 2.2925, df = 1, p-value = 0.13
[1] 0.8045027
Pearson's Chi-squared test with Yates' continuity correction
data: long_short.int.2x2
X-squared = 3.0408, df = 1, p-value = 0.08119
short_long.res <- data.table(short_long.odd_ratios, short_long.pvalues, i.mins, i.maxs, short_long.short.fraq, short_long.long.fraq)
short_long.res.melt <- melt(short_long.res, id=c("short_long.odd_ratios","short_long.pvalues", "i.mins", "i.maxs"))
short_long.GCs$type <- factor(short_long.GCs$type, levels=c("Short", "Long"))
ggplot(short_long.GCs) +
geom_violin(aes(as.factor(i.min), i.GC, fill=type)) +
scale_fill_brewer(palette = 'Blues') +
theme(legend.position = "top", legend.direction = "horizontal")

short_long.res.melt[, sig:=""]
short_long.res.melt[short_long.pvalues <= 0.05 , sig:="*"]
short_long.res.melt[short_long.pvalues <= 0.005 , sig:="**"]
short_long.res.melt[short_long.pvalues <= 0.000 , sig:="***"]
sig_rows <- short_long.res.melt[variable=="short_long.short.fraq" & sig!="", which = TRUE]
sig_anno <- short_long.res.melt[variable=="short_long.short.fraq" & sig!="", sig]
Fig3.C.new <- ggplot(short_long.res.melt, aes(as.factor(i.mins), value)) +
geom_bar(aes( group=variable, fill=variable), position="dodge", stat="identity") +
geom_signif( y_position=0.3, xmin=sig_rows-0.15, xmax=sig_rows+0.15, annotation=sig_anno, tip_length=0) +
scale_fill_discrete(name = "Intron type", labels = c("Short", "Long")) +
scale_fill_brewer(palette = 'Blues') +
theme(legend.position = "top", legend.direction = "horizontal")
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.
Fig3.C.new

Exon number
Here we explored how G4 enrichments change thorugh gene body
exons_1.up_plus <- read_dist_table("./exon_numbers/exons_1_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_1.down_plus <- read_dist_table("./exon_numbers/exons_1_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_1.up_minus <- read_dist_table("./exon_numbers/exons_1_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_1.down_minus <- read_dist_table("./exon_numbers/exons_1_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_1.up_minus[,Position:=Position*-1]
exons_1.down_minus[,Position:=Position*-1]
exons_1.TOTAL <- plot_density(exons_1.up_plus, exons_1.up_minus, exons_1.down_plus, exons_1.down_minus)
exons_2.up_plus <- read_dist_table("./exon_numbers/exons_2_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_2.down_plus <- read_dist_table("./exon_numbers/exons_2_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_2.up_minus <- read_dist_table("./exon_numbers/exons_2_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_2.down_minus <- read_dist_table("./exon_numbers/exons_2_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_2.up_minus[,Position:=Position*-1]
exons_2.down_minus[,Position:=Position*-1]
exons_2.TOTAL <- plot_density(exons_2.up_plus, exons_2.up_minus, exons_2.down_plus, exons_2.down_minus)
exons_3.up_plus <- read_dist_table("./exon_numbers/exons_3_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_3.down_plus <- read_dist_table("./exon_numbers/exons_3_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_3.up_minus <- read_dist_table("./exon_numbers/exons_3_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_3.down_minus <- read_dist_table("./exon_numbers/exons_3_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_3.up_minus[,Position:=Position*-1]
exons_3.down_minus[,Position:=Position*-1]
exons_3.TOTAL <- plot_density(exons_3.up_plus, exons_3.up_minus, exons_3.down_plus, exons_3.down_minus)
exons_4.up_plus <- read_dist_table("./exon_numbers/exons_4_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_4.down_plus <- read_dist_table("./exon_numbers/exons_4_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_4.up_minus <- read_dist_table("./exon_numbers/exons_4_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_4.down_minus <- read_dist_table("./exon_numbers/exons_4_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_4.up_minus[,Position:=Position*-1]
exons_4.down_minus[,Position:=Position*-1]
exons_4.TOTAL <- plot_density(exons_4.up_plus, exons_4.up_minus, exons_4.down_plus, exons_4.down_minus)
exons_middle.up_plus <- read_dist_table("./exon_numbers/exons_middle_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_middle.down_plus <- read_dist_table("./exon_numbers/exons_middle_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_middle.up_minus <- read_dist_table("./exon_numbers/exons_middle_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_middle.down_minus <- read_dist_table("./exon_numbers/exons_middle_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_middle.up_minus[,Position:=Position*-1]
exons_middle.down_minus[,Position:=Position*-1]
exons_middle.TOTAL <- plot_density(exons_middle.up_plus, exons_middle.up_minus, exons_middle.down_plus, exons_middle.down_minus)
exons_minus4.up_plus <- read_dist_table("./exon_numbers/exons_minus4_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_minus4.down_plus <- read_dist_table("./exon_numbers/exons_minus4_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_minus4.up_minus <- read_dist_table("./exon_numbers/exons_minus4_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_minus4.down_minus <- read_dist_table("./exon_numbers/exons_minus4_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_minus4.up_minus[,Position:=Position*-1]
exons_minus4.down_minus[,Position:=Position*-1]
exons_minus4.TOTAL <- plot_density(exons_minus4.up_plus, exons_minus4.up_minus, exons_minus4.down_plus, exons_minus4.down_minus)
exons_minus3.up_plus <- read_dist_table("./exon_numbers/exons_minus3_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_minus3.down_plus <- read_dist_table("./exon_numbers/exons_minus3_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_minus3.up_minus <- read_dist_table("./exon_numbers/exons_minus3_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_minus3.down_minus <- read_dist_table("./exon_numbers/exons_minus3_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_minus3.up_minus[,Position:=Position*-1]
exons_minus3.down_minus[,Position:=Position*-1]
exons_minus3.TOTAL <- plot_density(exons_minus3.up_plus, exons_minus3.up_minus, exons_minus3.down_plus, exons_minus3.down_minus)
exons_minus2.up_plus <- read_dist_table("./exon_numbers/exons_minus2_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_minus2.down_plus <- read_dist_table("./exon_numbers/exons_minus2_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_minus2.up_minus <- read_dist_table("./exon_numbers/exons_minus2_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_minus2.down_minus <- read_dist_table("./exon_numbers/exons_minus2_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_minus2.up_minus[,Position:=Position*-1]
exons_minus2.down_minus[,Position:=Position*-1]
exons_minus2.TOTAL <- plot_density(exons_minus2.up_plus, exons_minus2.up_minus, exons_minus2.down_plus, exons_minus2.down_minus)
exons_minus1.up_plus <- read_dist_table("./exon_numbers/exons_minus1_plus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_minus1.down_plus <- read_dist_table("./exon_numbers/exons_minus1_plus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_minus1.up_minus <- read_dist_table("./exon_numbers/exons_minus1_minus_strand_upstream.txt.score.G4.bed.list.out.num")
exons_minus1.down_minus <- read_dist_table("./exon_numbers/exons_minus1_minus_strand_downstream.txt.score.G4.bed.list.out.num")
exons_minus1.up_minus[,Position:=Position*-1]
exons_minus1.down_minus[,Position:=Position*-1]
exons_minus1.TOTAL <- plot_density(exons_minus1.up_plus, exons_minus1.up_minus, exons_minus1.down_plus, exons_minus1.down_minus)
exons_1.TOTAL[, exon_num:="1"]
exons_2.TOTAL[, exon_num:="2"]
exons_3.TOTAL[, exon_num:="3"]
exons_4.TOTAL[, exon_num:="4"]
exons_middle.TOTAL[, exon_num:="middle"]
exons_minus4.TOTAL[, exon_num:="-4"]
exons_minus3.TOTAL[, exon_num:="-3"]
exons_minus2.TOTAL[, exon_num:="-2"]
exons_minus1.TOTAL[, exon_num:="-1"]
exon_num.TOTAL <- rbind(exons_1.TOTAL, exons_2.TOTAL, exons_3.TOTAL, exons_4.TOTAL, exons_middle.TOTAL, exons_minus4.TOTAL, exons_minus3.TOTAL, exons_minus2.TOTAL, exons_minus1.TOTAL)
exon_num.TOTAL$exon_num <- factor(exon_num.TOTAL$exon_num, levels = c("1", "2", "3", "4", "middle", "-4", "-3", "-2", "-1" ))
ggplot(exon_num.TOTAL)+
geom_line(aes(x=Position,y=Enrrichment)) +
xlim(c(-300,300)) +
facet_grid( exon_pos ~ exon_num ) +
theme_bw()
Exon numbers by stratnds
exons_1.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_1_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_1.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_1_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_1.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_1_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_1.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_1_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_1.up_minus.nt[,Position:=Position*-1]
exons_1.down_minus.nt[,Position:=Position*-1]
exons_1.TOTAL.nt <- plot_density(exons_1.up_plus.nt, exons_1.up_minus.nt, exons_1.down_plus.nt, exons_1.down_minus.nt)

exons_1.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_1_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_1.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_1_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_1.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_1_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_1.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_1_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_1.up_minus.t[,Position:=Position*-1]
exons_1.down_minus.t[,Position:=Position*-1]
exons_1.TOTAL.t <- plot_density(exons_1.up_plus.t, exons_1.up_minus.t, exons_1.down_plus.t, exons_1.down_minus.t)

ggplot(exons_1.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()

exons_2.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_2_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_2.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_2_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_2.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_2_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_2.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_2_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_2.up_minus.nt[,Position:=Position*-1]
exons_2.down_minus.nt[,Position:=Position*-1]
exons_2.TOTAL.nt <- plot_density(exons_2.up_plus.nt, exons_2.up_minus.nt, exons_2.down_plus.nt, exons_2.down_minus.nt)

exons_2.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_2_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_2.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_2_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_2.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_2_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_2.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_2_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_2.up_minus.t[,Position:=Position*-1]
exons_2.down_minus.t[,Position:=Position*-1]
exons_2.TOTAL.t <- plot_density(exons_2.up_plus.t, exons_2.up_minus.t, exons_2.down_plus.t, exons_2.down_minus.t)

ggplot(exons_2.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()

exons_3.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_3_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_3.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_3_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_3.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_3_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_3.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_3_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_3.up_minus.nt[,Position:=Position*-1]
exons_3.down_minus.nt[,Position:=Position*-1]
exons_3.TOTAL.nt <- plot_density(exons_3.up_plus.nt, exons_3.up_minus.nt, exons_3.down_plus.nt, exons_3.down_minus.nt)

exons_3.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_3_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_3.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_3_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_3.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_3_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_3.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_3_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_3.up_minus.t[,Position:=Position*-1]
exons_3.down_minus.t[,Position:=Position*-1]
exons_3.TOTAL.t <- plot_density(exons_3.up_plus.t, exons_3.up_minus.t, exons_3.down_plus.t, exons_3.down_minus.t)

ggplot(exons_3.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()

exons_4.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_4_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_4.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_4_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_4.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_4_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_4.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_4_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_4.up_minus.nt[,Position:=Position*-1]
exons_4.down_minus.nt[,Position:=Position*-1]
exons_4.TOTAL.nt <- plot_density(exons_4.up_plus.nt, exons_4.up_minus.nt, exons_4.down_plus.nt, exons_4.down_minus.nt)

exons_4.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_4_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_4.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_4_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_4.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_4_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_4.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_4_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_4.up_minus.t[,Position:=Position*-1]
exons_4.down_minus.t[,Position:=Position*-1]
exons_4.TOTAL.t <- plot_density(exons_4.up_plus.t, exons_4.up_minus.t, exons_4.down_plus.t, exons_4.down_minus.t)

ggplot(exons_4.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()

exons_middle.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_middle_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_middle.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_middle_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_middle.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_middle_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_middle.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_middle_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_middle.up_minus.nt[,Position:=Position*-1]
exons_middle.down_minus.nt[,Position:=Position*-1]
exons_middle.TOTAL.nt <- plot_density(exons_middle.up_plus.nt, exons_middle.up_minus.nt, exons_middle.down_plus.nt, exons_middle.down_minus.nt)

exons_middle.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_middle_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_middle.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_middle_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_middle.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_middle_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_middle.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_middle_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_middle.up_minus.t[,Position:=Position*-1]
exons_middle.down_minus.t[,Position:=Position*-1]
exons_middle.TOTAL.t <- plot_density(exons_middle.up_plus.t, exons_middle.up_minus.t, exons_middle.down_plus.t, exons_middle.down_minus.t)

ggplot(exons_middle.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()

exons_minus4.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_minus4_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_minus4.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_minus4_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_minus4.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_minus4_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_minus4.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_minus4_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_minus4.up_minus.nt[,Position:=Position*-1]
exons_minus4.down_minus.nt[,Position:=Position*-1]
exons_minus4.TOTAL.nt <- plot_density(exons_minus4.up_plus.nt, exons_minus4.up_minus.nt, exons_minus4.down_plus.nt, exons_minus4.down_minus.nt)

exons_minus4.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_minus4_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_minus4.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_minus4_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_minus4.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_minus4_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_minus4.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_minus4_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_minus4.up_minus.t[,Position:=Position*-1]
exons_minus4.down_minus.t[,Position:=Position*-1]
exons_minus4.TOTAL.t <- plot_density(exons_minus4.up_plus.t, exons_minus4.up_minus.t, exons_minus4.down_plus.t, exons_minus4.down_minus.t)

ggplot(exons_minus4.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()

exons_minus3.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_minus3_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_minus3.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_minus3_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_minus3.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_minus3_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_minus3.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_minus3_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_minus3.up_minus.nt[,Position:=Position*-1]
exons_minus3.down_minus.nt[,Position:=Position*-1]
exons_minus3.TOTAL.nt <- plot_density(exons_minus3.up_plus.nt, exons_minus3.up_minus.nt, exons_minus3.down_plus.nt, exons_minus3.down_minus.nt)

exons_minus3.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_minus3_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_minus3.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_minus3_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_minus3.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_minus3_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_minus3.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_minus3_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_minus3.up_minus.t[,Position:=Position*-1]
exons_minus3.down_minus.t[,Position:=Position*-1]
exons_minus3.TOTAL.t <- plot_density(exons_minus3.up_plus.t, exons_minus3.up_minus.t, exons_minus3.down_plus.t, exons_minus3.down_minus.t)

ggplot(exons_minus3.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()

exons_minus2.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_minus2_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_minus2.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_minus2_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_minus2.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_minus2_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_minus2.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_minus2_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_minus2.up_minus.nt[,Position:=Position*-1]
exons_minus2.down_minus.nt[,Position:=Position*-1]
exons_minus2.TOTAL.nt <- plot_density(exons_minus2.up_plus.nt, exons_minus2.up_minus.nt, exons_minus2.down_plus.nt, exons_minus2.down_minus.nt)

exons_minus2.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_minus2_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_minus2.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_minus2_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_minus2.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_minus2_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_minus2.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_minus2_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_minus2.up_minus.t[,Position:=Position*-1]
exons_minus2.down_minus.t[,Position:=Position*-1]
exons_minus2.TOTAL.t <- plot_density(exons_minus2.up_plus.t, exons_minus2.up_minus.t, exons_minus2.down_plus.t, exons_minus2.down_minus.t)

ggplot(exons_minus2.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()

exons_minus1.up_plus.nt <- read_dist_table("./exon_numbers/strands/exons_minus1_plus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_minus1.down_plus.nt <- read_dist_table("./exon_numbers/strands/exons_minus1_plus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_minus1.up_minus.nt <- read_dist_table("./exon_numbers/strands/exons_minus1_minus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_minus1.down_minus.nt <- read_dist_table("./exon_numbers/strands/exons_minus1_minus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_minus1.up_minus.nt[,Position:=Position*-1]
exons_minus1.down_minus.nt[,Position:=Position*-1]
exons_minus1.TOTAL.nt <- plot_density(exons_minus1.up_plus.nt, exons_minus1.up_minus.nt, exons_minus1.down_plus.nt, exons_minus1.down_minus.nt)

exons_minus1.up_plus.t <- read_dist_table("./exon_numbers/strands/exons_minus1_plus_strand_upstream.txt.score.G4_minus.bed.list.out.num")
exons_minus1.down_plus.t <- read_dist_table("./exon_numbers/strands/exons_minus1_plus_strand_downstream.txt.score.G4_minus.bed.list.out.num")
exons_minus1.up_minus.t <- read_dist_table("./exon_numbers/strands/exons_minus1_minus_strand_upstream.txt.score.G4_plus.bed.list.out.num")
exons_minus1.down_minus.t <- read_dist_table("./exon_numbers/strands/exons_minus1_minus_strand_downstream.txt.score.G4_plus.bed.list.out.num")
exons_minus1.up_minus.t[,Position:=Position*-1]
exons_minus1.down_minus.t[,Position:=Position*-1]
exons_minus1.TOTAL.t <- plot_density(exons_minus1.up_plus.t, exons_minus1.up_minus.t, exons_minus1.down_plus.t, exons_minus1.down_minus.t)

ggplot(exons_minus1.TOTAL.t)+
geom_line(aes(x=Position,y=Enrrichment)) +
facet_grid( . ~ exon_pos ) +
ylim(c(0,6)) +
theme_bw()


G4 seq
Here we distribution of G4-seq experiments
G4_2019.K.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.K.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.K.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.PDS.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.PDS.Qs.plus.up.list <- list(G4_2019.PDS.Q1_up_plus, G4_2019.PDS.Q2_up_plus, G4_2019.PDS.Q3_up_plus, G4_2019.PDS.Q4_up_plus)
G4_2019.PDS.Qs.minus.list <- list(G4_2019.PDS.Q1_up_minus, G4_2019.PDS.Q2_up_minus, G4_2019.PDS.Q3_up_minus, G4_2019.PDS.Q4_up_minus)
G4_2019.PDS.Qs.plus.down.list <- list(G4_2019.PDS.Q1_down_plus, G4_2019.PDS.Q2_down_plus, G4_2019.PDS.Q3_down_plus, G4_2019.PDS.Q4_down_plus)
G4_2019.PDS.Qs.minus.down.list <- list(G4_2019.PDS.Q1_down_minus, G4_2019.PDS.Q2_down_minus, G4_2019.PDS.Q3_down_minus, G4_2019.PDS.Q4_down_minus)
G4_2019.PDS.window_len = 2000
G4_2019.PDS.Qs.total <- get_total_Qs(G4_2019.PDS.Qs.plus.up.list, G4_2019.PDS.Qs.minus.list, G4_2019.PDS.Qs.plus.down.list, G4_2019.PDS.Qs.minus.down.list, G4_2019.PDS.window_len)
ggplot(G4_2019.PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-200,200)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw() +
labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template.PDS.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.non_template.PDS.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
G4_2019.template.PDS.Qs.plus.up.list <- list(G4_2019.template.PDS.Q1_up_plus, G4_2019.template.PDS.Q2_up_plus, G4_2019.template.PDS.Q3_up_plus, G4_2019.template.PDS.Q4_up_plus)
G4_2019.template.PDS.Qs.minus.list <- list(G4_2019.template.PDS.Q1_up_minus, G4_2019.template.PDS.Q2_up_minus, G4_2019.template.PDS.Q3_up_minus, G4_2019.template.PDS.Q4_up_minus)
G4_2019.template.PDS.Qs.plus.down.list <- list(G4_2019.template.PDS.Q1_down_plus, G4_2019.template.PDS.Q2_down_plus, G4_2019.template.PDS.Q3_down_plus, G4_2019.template.PDS.Q4_down_plus)
G4_2019.template.PDS.Qs.minus.down.list <- list(G4_2019.template.PDS.Q1_down_minus, G4_2019.template.PDS.Q2_down_minus, G4_2019.template.PDS.Q3_down_minus, G4_2019.template.PDS.Q4_down_minus)
G4_2019.template.PDS.window_len = 2000
G4_2019.template.PDS.Qs.total <- get_total_Qs(G4_2019.template.PDS.Qs.plus.up.list, G4_2019.template.PDS.Qs.minus.list, G4_2019.template.PDS.Qs.plus.down.list, G4_2019.template.PDS.Qs.minus.down.list, G4_2019.template.PDS.window_len)
G4_2019.non_template.PDS.Qs.plus.up.list <- list(G4_2019.non_template.PDS.Q1_up_plus, G4_2019.non_template.PDS.Q2_up_plus, G4_2019.non_template.PDS.Q3_up_plus, G4_2019.non_template.PDS.Q4_up_plus)
G4_2019.non_template.PDS.Qs.minus.list <- list(G4_2019.non_template.PDS.Q1_up_minus, G4_2019.non_template.PDS.Q2_up_minus, G4_2019.non_template.PDS.Q3_up_minus, G4_2019.non_template.PDS.Q4_up_minus)
G4_2019.non_template.PDS.Qs.plus.down.list <- list(G4_2019.non_template.PDS.Q1_down_plus, G4_2019.non_template.PDS.Q2_down_plus, G4_2019.non_template.PDS.Q3_down_plus, G4_2019.non_template.PDS.Q4_down_plus)
G4_2019.non_template.PDS.Qs.minus.down.list <- list(G4_2019.non_template.PDS.Q1_down_minus, G4_2019.non_template.PDS.Q2_down_minus, G4_2019.non_template.PDS.Q3_down_minus, G4_2019.non_template.PDS.Q4_down_minus)
G4_2019.non_template.PDS.window_len = 2000
G4_2019.non_template.PDS.Qs.total <- get_total_Qs(G4_2019.non_template.PDS.Qs.plus.up.list, G4_2019.non_template.PDS.Qs.minus.list, G4_2019.non_template.PDS.Qs.plus.down.list, G4_2019.non_template.PDS.Qs.minus.down.list, G4_2019.non_template.PDS.window_len)
G4_2019.template_non_template.PDS.Qs.total <- rbind(G4_2019.template.PDS.Qs.total, G4_2019.non_template.PDS.Qs.total)
half_n <- nrow(G4_2019.template_non_template.PDS.Qs.total)/2
G4_2019.template_non_template.PDS.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4_2019.template_non_template.PDS.Qs.total$Strand <- factor(G4_2019.template_non_template.PDS.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4_2019.template_non_template.PDS.Qs.total$Q <- mapvalues(G4_2019.template_non_template.PDS.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(G4_2019.template_non_template.PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template_non_template.PDS.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2019.template_non_template.PDS.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2019.template_non_template.PDS.Qs.total$new_Strand <- factor(G4_2019.template_non_template.PDS.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2019.template_non_template.PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( new_Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template.K.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q1_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q2_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q3_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q4_up_plus <- read_dist_table("./G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q1_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q2_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q3_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q4_up_minus <- read_dist_table("./G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q1_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q2_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q3_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q4_down_plus <- read_dist_table("./G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q1_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q2_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q3_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.non_template.K.Q4_down_minus <- read_dist_table("./G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
G4_2019.template.K.Qs.plus.up.list <- list(G4_2019.template.K.Q1_up_plus, G4_2019.template.K.Q2_up_plus, G4_2019.template.K.Q3_up_plus, G4_2019.template.K.Q4_up_plus)
G4_2019.template.K.Qs.minus.list <- list(G4_2019.template.K.Q1_up_minus, G4_2019.template.K.Q2_up_minus, G4_2019.template.K.Q3_up_minus, G4_2019.template.K.Q4_up_minus)
G4_2019.template.K.Qs.plus.down.list <- list(G4_2019.template.K.Q1_down_plus, G4_2019.template.K.Q2_down_plus, G4_2019.template.K.Q3_down_plus, G4_2019.template.K.Q4_down_plus)
G4_2019.template.K.Qs.minus.down.list <- list(G4_2019.template.K.Q1_down_minus, G4_2019.template.K.Q2_down_minus, G4_2019.template.K.Q3_down_minus, G4_2019.template.K.Q4_down_minus)
G4_2019.template.K.window_len = 2000
G4_2019.template.K.Qs.total <- get_total_Qs(G4_2019.template.K.Qs.plus.up.list, G4_2019.template.K.Qs.minus.list, G4_2019.template.K.Qs.plus.down.list, G4_2019.template.K.Qs.minus.down.list, G4_2019.template.K.window_len)
G4_2019.non_template.K.Qs.plus.up.list <- list(G4_2019.non_template.K.Q1_up_plus, G4_2019.non_template.K.Q2_up_plus, G4_2019.non_template.K.Q3_up_plus, G4_2019.non_template.K.Q4_up_plus)
G4_2019.non_template.K.Qs.minus.list <- list(G4_2019.non_template.K.Q1_up_minus, G4_2019.non_template.K.Q2_up_minus, G4_2019.non_template.K.Q3_up_minus, G4_2019.non_template.K.Q4_up_minus)
G4_2019.non_template.K.Qs.plus.down.list <- list(G4_2019.non_template.K.Q1_down_plus, G4_2019.non_template.K.Q2_down_plus, G4_2019.non_template.K.Q3_down_plus, G4_2019.non_template.K.Q4_down_plus)
G4_2019.non_template.K.Qs.minus.down.list <- list(G4_2019.non_template.K.Q1_down_minus, G4_2019.non_template.K.Q2_down_minus, G4_2019.non_template.K.Q3_down_minus, G4_2019.non_template.K.Q4_down_minus)
G4_2019.non_template.K.window_len = 2000
G4_2019.non_template.K.Qs.total <- get_total_Qs(G4_2019.non_template.K.Qs.plus.up.list, G4_2019.non_template.K.Qs.minus.list, G4_2019.non_template.K.Qs.plus.down.list, G4_2019.non_template.K.Qs.minus.down.list, G4_2019.non_template.K.window_len)
G4_2019.template.K.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 825 903.0 0.9136213 840 854 0.9836066 1665 1741 0.9563469 Upstream
2: -1000 2 673 716.0 0.9399441 638 684 0.9327485 1311 1408 0.9311080 Upstream
3: -1000 3 555 567.0 0.9788360 592 546 1.0842491 1147 1116 1.0277778 Upstream
4: -1000 4 413 370.0 1.1162162 364 370 0.9837838 777 749 1.0373832 Upstream
5: -999 1 833 903.0 0.9224806 845 854 0.9894614 1678 1741 0.9638139 Upstream
---
15988: 997 4 480 540.0 0.8888889 474 540 0.8777778 954 1093 0.8728271 Downstream
15989: 998 1 579 698.0 0.8295129 561 640 0.8765625 1140 1347 0.8463252 Downstream
15990: 998 2 560 680.0 0.8235294 527 657 0.8021309 1087 1334 0.8148426 Downstream
15991: 998 3 504 590.5 0.8535140 472 595 0.7932773 976 1192 0.8187919 Downstream
15992: 998 4 484 540.0 0.8962963 474 540 0.8777778 958 1093 0.8764867 Downstream
G4_2019.non_template.K.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 682 749 0.9105474 697 726 0.9600551 1379 1471 0.9374575 Upstream
2: -1000 2 564 618 0.9126214 573 594 0.9646465 1137 1212 0.9381188 Upstream
3: -1000 3 455 469 0.9701493 455 450 1.0111111 910 920 0.9891304 Upstream
4: -1000 4 339 341 0.9941349 345 324 1.0648148 684 665 1.0285714 Upstream
5: -999 1 685 749 0.9145527 695 726 0.9573003 1380 1471 0.9381373 Upstream
---
15988: 997 4 475 505 0.9405941 453 471 0.9617834 928 969 0.9576883 Downstream
15989: 998 1 614 600 1.0233333 494 558 0.8853047 1108 1151 0.9626412 Downstream
15990: 998 2 553 567 0.9753086 542 548 0.9890511 1095 1113 0.9838275 Downstream
15991: 998 3 530 523 1.0133843 461 494 0.9331984 991 1014 0.9773176 Downstream
15992: 998 4 474 505 0.9386139 456 471 0.9681529 930 969 0.9597523 Downstream
G4_2019.template_non_template.K.Qs.total <- rbind(G4_2019.template.K.Qs.total, G4_2019.non_template.K.Qs.total)
half_n <- nrow(G4_2019.template_non_template.K.Qs.total)/2
G4_2019.template_non_template.K.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4_2019.template_non_template.K.Qs.total$Strand <- factor(G4_2019.template_non_template.K.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4_2019.template_non_template.K.Qs.total$Q <- mapvalues(G4_2019.template_non_template.K.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2019.template_non_template.K.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2019.template_non_template.K.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2019.template_non_template.K.Qs.total$new_Strand <- factor(G4_2019.template_non_template.K.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2019.template_non_template.K.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-150,150)) +
facet_grid( new_Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

#2015
G4_2015.Na_PDS.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_PDS.Qs.plus.up.list <- list(G4_2015.Na_PDS.Q1_up_plus, G4_2015.Na_PDS.Q2_up_plus, G4_2015.Na_PDS.Q3_up_plus, G4_2015.Na_PDS.Q4_up_plus)
G4_2015.Na_PDS.Qs.minus.list <- list(G4_2015.Na_PDS.Q1_up_minus, G4_2015.Na_PDS.Q2_up_minus, G4_2015.Na_PDS.Q3_up_minus, G4_2015.Na_PDS.Q4_up_minus)
G4_2015.Na_PDS.Qs.plus.down.list <- list(G4_2015.Na_PDS.Q1_down_plus, G4_2015.Na_PDS.Q2_down_plus, G4_2015.Na_PDS.Q3_down_plus, G4_2015.Na_PDS.Q4_down_plus)
G4_2015.Na_PDS.Qs.minus.down.list <- list(G4_2015.Na_PDS.Q1_down_minus, G4_2015.Na_PDS.Q2_down_minus, G4_2015.Na_PDS.Q3_down_minus, G4_2015.Na_PDS.Q4_down_minus)
G4_2015.Na_PDS.window_len = 2000
G4_2015.Na_PDS.Qs.total <- get_total_Qs(G4_2015.Na_PDS.Qs.plus.up.list, G4_2015.Na_PDS.Qs.minus.list, G4_2015.Na_PDS.Qs.plus.down.list, G4_2015.Na_PDS.Qs.minus.down.list, G4_2015.Na_PDS.window_len)
ggplot(G4_2015.Na_PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-200,200)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw() +
labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.Na_K.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.Na_K.Qs.plus.up.list <- list(G4_2015.Na_K.Q1_up_plus, G4_2015.Na_K.Q2_up_plus, G4_2015.Na_K.Q3_up_plus, G4_2015.Na_K.Q4_up_plus)
G4_2015.Na_K.Qs.minus.list <- list(G4_2015.Na_K.Q1_up_minus, G4_2015.Na_K.Q2_up_minus, G4_2015.Na_K.Q3_up_minus, G4_2015.Na_K.Q4_up_minus)
G4_2015.Na_K.Qs.plus.down.list <- list(G4_2015.Na_K.Q1_down_plus, G4_2015.Na_K.Q2_down_plus, G4_2015.Na_K.Q3_down_plus, G4_2015.Na_K.Q4_down_plus)
G4_2015.Na_K.Qs.minus.down.list <- list(G4_2015.Na_K.Q1_down_minus, G4_2015.Na_K.Q2_down_minus, G4_2015.Na_K.Q3_down_minus, G4_2015.Na_K.Q4_down_minus)
G4_2015.Na_K.window_len = 2000
G4_2015.Na_K.Qs.total <- get_total_Qs(G4_2015.Na_K.Qs.plus.up.list, G4_2015.Na_K.Qs.minus.list, G4_2015.Na_K.Qs.plus.down.list, G4_2015.Na_K.Qs.minus.down.list, G4_2015.Na_K.window_len)
ggplot(G4_2015.Na_K.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-200,200)) +
facet_grid( . ~ exon_pos ) +
theme(text = element_text(size=15)) +
theme_bw() +
labs(colour = "Splice site stregth quartile") +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.template.Na_PDS.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_PDS.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_PDS.Qs.plus.up.list <- list(G4_2015.template.Na_PDS.Q1_up_plus, G4_2015.template.Na_PDS.Q2_up_plus, G4_2015.template.Na_PDS.Q3_up_plus, G4_2015.template.Na_PDS.Q4_up_plus)
G4_2015.template.Na_PDS.Qs.minus.list <- list(G4_2015.template.Na_PDS.Q1_up_minus, G4_2015.template.Na_PDS.Q2_up_minus, G4_2015.template.Na_PDS.Q3_up_minus, G4_2015.template.Na_PDS.Q4_up_minus)
G4_2015.template.Na_PDS.Qs.plus.down.list <- list(G4_2015.template.Na_PDS.Q1_down_plus, G4_2015.template.Na_PDS.Q2_down_plus, G4_2015.template.Na_PDS.Q3_down_plus, G4_2015.template.Na_PDS.Q4_down_plus)
G4_2015.template.Na_PDS.Qs.minus.down.list <- list(G4_2015.template.Na_PDS.Q1_down_minus, G4_2015.template.Na_PDS.Q2_down_minus, G4_2015.template.Na_PDS.Q3_down_minus, G4_2015.template.Na_PDS.Q4_down_minus)
G4_2015.template.Na_PDS.window_len = 2000
G4_2015.template.Na_PDS.Qs.total <- get_total_Qs(G4_2015.template.Na_PDS.Qs.plus.up.list, G4_2015.template.Na_PDS.Qs.minus.list, G4_2015.template.Na_PDS.Qs.plus.down.list, G4_2015.template.Na_PDS.Qs.minus.down.list, G4_2015.template.Na_PDS.window_len)
G4_2015.non_template.Na_PDS.Qs.plus.up.list <- list(G4_2015.non_template.Na_PDS.Q1_up_plus, G4_2015.non_template.Na_PDS.Q2_up_plus, G4_2015.non_template.Na_PDS.Q3_up_plus, G4_2015.non_template.Na_PDS.Q4_up_plus)
G4_2015.non_template.Na_PDS.Qs.minus.list <- list(G4_2015.non_template.Na_PDS.Q1_up_minus, G4_2015.non_template.Na_PDS.Q2_up_minus, G4_2015.non_template.Na_PDS.Q3_up_minus, G4_2015.non_template.Na_PDS.Q4_up_minus)
G4_2015.non_template.Na_PDS.Qs.plus.down.list <- list(G4_2015.non_template.Na_PDS.Q1_down_plus, G4_2015.non_template.Na_PDS.Q2_down_plus, G4_2015.non_template.Na_PDS.Q3_down_plus, G4_2015.non_template.Na_PDS.Q4_down_plus)
G4_2015.non_template.Na_PDS.Qs.minus.down.list <- list(G4_2015.non_template.Na_PDS.Q1_down_minus, G4_2015.non_template.Na_PDS.Q2_down_minus, G4_2015.non_template.Na_PDS.Q3_down_minus, G4_2015.non_template.Na_PDS.Q4_down_minus)
G4_2015.non_template.Na_PDS.window_len = 2000
G4_2015.non_template.Na_PDS.Qs.total <- get_total_Qs(G4_2015.non_template.Na_PDS.Qs.plus.up.list, G4_2015.non_template.Na_PDS.Qs.minus.list, G4_2015.non_template.Na_PDS.Qs.plus.down.list, G4_2015.non_template.Na_PDS.Qs.minus.down.list, G4_2015.non_template.Na_PDS.window_len)
G4_2015.template.Na_PDS.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 3230 3421 0.9441684 3119 3238.5 0.9631002 6349 6677 0.9508761 Upstream
2: -1000 2 2693 2711 0.9933604 2396 2540.0 0.9433071 5089 5232 0.9726682 Upstream
3: -1000 3 1991 1997 0.9969955 1927 1975.0 0.9756962 3918 3998 0.9799900 Upstream
4: -1000 4 1455 1331 1.0931630 1357 1287.0 1.0543901 2812 2635 1.0671727 Upstream
5: -999 1 3244 3421 0.9482607 3112 3238.5 0.9609387 6356 6677 0.9519245 Upstream
---
15988: 997 4 1716 2058 0.8338192 1686 2051.0 0.8220380 3402 4144 0.8209459 Downstream
15989: 998 1 2169 2586 0.8387471 2143 2386.0 0.8981559 4312 4961 0.8691796 Downstream
15990: 998 2 2130 2578 0.8262219 1926 2395.0 0.8041754 4056 4983 0.8139675 Downstream
15991: 998 3 1854 2200 0.8427273 1865 2153.0 0.8662332 3719 4357 0.8535690 Downstream
15992: 998 4 1716 2058 0.8338192 1684 2051.0 0.8210629 3400 4144 0.8204633 Downstream
G4_2015.non_template.Na_PDS.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 2746 2794.0 0.9828203 2528 2744.0 0.9212828 5274 5538 0.9523294 Upstream
2: -1000 2 2178 2259.0 0.9641434 1987 2130.0 0.9328638 4165 4378 0.9513476 Upstream
3: -1000 3 1591 1697.0 0.9375368 1566 1590.0 0.9849057 3157 3266 0.9666258 Upstream
4: -1000 4 1190 1162.0 1.0240964 1095 1068.0 1.0252809 2285 2223 1.0278902 Upstream
5: -999 1 2736 2794.0 0.9792412 2533 2744.0 0.9231050 5269 5538 0.9514265 Upstream
---
15988: 997 4 1671 1744.0 0.9581422 1540 1686.0 0.9134045 3211 3394 0.9460813 Downstream
15989: 998 1 2109 2196.0 0.9603825 1862 2021.0 0.9213261 3971 4204 0.9445766 Downstream
15990: 998 2 1996 2118.5 0.9421761 1846 2024.5 0.9118301 3842 4140 0.9280193 Downstream
15991: 998 3 1793 1857.0 0.9655358 1733 1799.0 0.9633130 3526 3665 0.9620737 Downstream
15992: 998 4 1672 1744.0 0.9587156 1545 1686.0 0.9163701 3217 3394 0.9478491 Downstream
G4_2015.template_non_template.Na_PDS.Qs.total <- rbind(G4_2015.template.Na_PDS.Qs.total, G4_2015.non_template.Na_PDS.Qs.total)
half_n <- nrow(G4_2015.template_non_template.Na_PDS.Qs.total)/2
G4_2015.template_non_template.Na_PDS.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4_2015.template_non_template.Na_PDS.Qs.total$Strand <- factor(G4_2015.template_non_template.Na_PDS.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4_2015.template_non_template.Na_PDS.Qs.total$Q <- mapvalues(G4_2015.template_non_template.Na_PDS.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2015.template_non_template.Na_PDS.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2015.template_non_template.Na_PDS.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2015.template_non_template.Na_PDS.Qs.total$new_Strand <- factor(G4_2015.template_non_template.Na_PDS.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2015.template_non_template.Na_PDS.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-300,300)) +
facet_grid( new_Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.template.Na_K.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q1_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q2_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q3_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q4_up_plus <- read_dist_table("./G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q1_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q2_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q3_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q4_up_minus <- read_dist_table("./G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q1_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q2_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q3_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q4_down_plus <- read_dist_table("./G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q1_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q2_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q3_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.non_template.Na_K.Q4_down_minus <- read_dist_table("./G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
G4_2015.template.Na_K.Qs.plus.up.list <- list(G4_2015.template.Na_K.Q1_up_plus, G4_2015.template.Na_K.Q2_up_plus, G4_2015.template.Na_K.Q3_up_plus, G4_2015.template.Na_K.Q4_up_plus)
G4_2015.template.Na_K.Qs.minus.list <- list(G4_2015.template.Na_K.Q1_up_minus, G4_2015.template.Na_K.Q2_up_minus, G4_2015.template.Na_K.Q3_up_minus, G4_2015.template.Na_K.Q4_up_minus)
G4_2015.template.Na_K.Qs.plus.down.list <- list(G4_2015.template.Na_K.Q1_down_plus, G4_2015.template.Na_K.Q2_down_plus, G4_2015.template.Na_K.Q3_down_plus, G4_2015.template.Na_K.Q4_down_plus)
G4_2015.template.Na_K.Qs.minus.down.list <- list(G4_2015.template.Na_K.Q1_down_minus, G4_2015.template.Na_K.Q2_down_minus, G4_2015.template.Na_K.Q3_down_minus, G4_2015.template.Na_K.Q4_down_minus)
G4_2015.template.Na_K.window_len = 2000
G4_2015.template.Na_K.Qs.total <- get_total_Qs(G4_2015.template.Na_K.Qs.plus.up.list, G4_2015.template.Na_K.Qs.minus.list, G4_2015.template.Na_K.Qs.plus.down.list, G4_2015.template.Na_K.Qs.minus.down.list, G4_2015.template.Na_K.window_len)
G4_2015.non_template.Na_K.Qs.plus.up.list <- list(G4_2015.non_template.Na_K.Q1_up_plus, G4_2015.non_template.Na_K.Q2_up_plus, G4_2015.non_template.Na_K.Q3_up_plus, G4_2015.non_template.Na_K.Q4_up_plus)
G4_2015.non_template.Na_K.Qs.minus.list <- list(G4_2015.non_template.Na_K.Q1_up_minus, G4_2015.non_template.Na_K.Q2_up_minus, G4_2015.non_template.Na_K.Q3_up_minus, G4_2015.non_template.Na_K.Q4_up_minus)
G4_2015.non_template.Na_K.Qs.plus.down.list <- list(G4_2015.non_template.Na_K.Q1_down_plus, G4_2015.non_template.Na_K.Q2_down_plus, G4_2015.non_template.Na_K.Q3_down_plus, G4_2015.non_template.Na_K.Q4_down_plus)
G4_2015.non_template.Na_K.Qs.minus.down.list <- list(G4_2015.non_template.Na_K.Q1_down_minus, G4_2015.non_template.Na_K.Q2_down_minus, G4_2015.non_template.Na_K.Q3_down_minus, G4_2015.non_template.Na_K.Q4_down_minus)
G4_2015.non_template.Na_K.window_len = 2000
G4_2015.non_template.Na_K.Qs.total <- get_total_Qs(G4_2015.non_template.Na_K.Qs.plus.up.list, G4_2015.non_template.Na_K.Qs.minus.list, G4_2015.non_template.Na_K.Qs.plus.down.list, G4_2015.non_template.Na_K.Qs.minus.down.list, G4_2015.non_template.Na_K.window_len)
G4_2015.template.Na_K.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 2362 2490.0 0.9485944 2292 2412.0 0.9502488 4654 4893 0.9511547 Upstream
2: -1000 2 1928 1952.0 0.9877049 1753 1901.0 0.9221462 3681 3861 0.9533800 Upstream
3: -1000 3 1549 1514.0 1.0231176 1497 1471.0 1.0176751 3046 2984 1.0207775 Upstream
4: -1000 4 1099 1038.0 1.0587669 1074 1000.0 1.0740000 2173 2036 1.0672888 Upstream
5: -999 1 2356 2490.0 0.9461847 2299 2412.0 0.9531509 4655 4893 0.9513591 Upstream
---
15988: 997 4 1294 1470.5 0.8799728 1309 1463.5 0.8944312 2603 2934 0.8871847 Downstream
15989: 998 1 1609 1914.0 0.8406479 1565 1797.0 0.8708959 3174 3710 0.8555256 Downstream
15990: 998 2 1556 1874.0 0.8303095 1486 1786.0 0.8320269 3042 3657 0.8318294 Downstream
15991: 998 3 1403 1633.0 0.8591549 1386 1618.0 0.8566131 2789 3265 0.8542113 Downstream
15992: 998 4 1294 1470.5 0.8799728 1305 1463.5 0.8916980 2599 2934 0.8858214 Downstream
G4_2015.non_template.Na_K.Qs.total
Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment exon_pos
1: -1000 1 1927 2021.0 0.9534884 1792 1970.5 0.9094139 3719 3995 0.9309136 Upstream
2: -1000 2 1575 1674.5 0.9405793 1500 1575.5 0.9520787 3075 3242 0.9484886 Upstream
3: -1000 3 1265 1280.0 0.9882812 1183 1197.0 0.9883041 2448 2474 0.9894907 Upstream
4: -1000 4 930 926.0 1.0043197 870 852.0 1.0211268 1800 1765 1.0198300 Upstream
5: -999 1 1924 2021.0 0.9520040 1795 1970.5 0.9109363 3719 3995 0.9309136 Upstream
---
15988: 997 4 1320 1303.0 1.0130468 1142 1275.0 0.8956863 2462 2566 0.9594700 Downstream
15989: 998 1 1569 1623.0 0.9667283 1369 1523.5 0.8985888 2938 3121 0.9413649 Downstream
15990: 998 2 1468 1579.0 0.9297023 1422 1466.0 0.9699864 2890 3039 0.9509707 Downstream
15991: 998 3 1368 1408.0 0.9715909 1280 1327.0 0.9645818 2648 2734 0.9685443 Downstream
15992: 998 4 1319 1303.0 1.0122794 1145 1275.0 0.8980392 2464 2566 0.9602494 Downstream
G4_2015.template_non_template.Na_K.Qs.total <- rbind(G4_2015.template.Na_K.Qs.total, G4_2015.non_template.Na_K.Qs.total)
half_n <- nrow(G4_2015.template_non_template.Na_K.Qs.total)/2
G4_2015.template_non_template.Na_K.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
G4_2015.template_non_template.Na_K.Qs.total$Strand <- factor(G4_2015.template_non_template.Na_K.Qs.total$Strand, levels=c("Template", "Non-template" ))
G4_2015.template_non_template.Na_K.Qs.total$Q <- mapvalues(G4_2015.template_non_template.Na_K.Qs.total$Q, from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2015.template_non_template.Na_K.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2015.template_non_template.Na_K.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2015.template_non_template.Na_K.Qs.total$new_Strand <- factor(G4_2015.template_non_template.Na_K.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2015.template_non_template.Na_K.Qs.total)+
geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
xlim(c(-300,300)) +
facet_grid( new_Strand ~ exon_pos ) +
labs(colour = "Splice site stregth quartile") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

KCl RNA-seq
As K+ is known to stabilize G4, we analized (RNA-seq data)[https://www.ncbi.nlm.nih.gov/bioproject/PRJEB19451] comming from neurons after 4-hour KCl-indused depolarization.
KCL_human_upstream <- fread("../KCL/MicroExonator/Control_vs_KCL.diff.upstream_100nt.G4s" ) #stop here
colnames(KCL_human_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_human_downstream<- fread("../KCL/MicroExonator/Control_vs_KCL.diff.downstream_100nt.G4s" )
colnames(KCL_human_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_human <- merge(KCL_human_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
KCL_human_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
KCL_human[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_human[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_human$G4_bol <- factor(KCL_human$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_human[end - start > 30, exon:="exon" ]
KCL_human[end - start <= 30, exon:="microexon" ]
size.var=0.5
alpha.var=0.25
ggplot(data=KCL_human[ Type=="CE",]) +
geom_point( aes(x=-DeltaPsi, y=Probability), colour="grey", alpha=alpha.var, size=size.var) +
geom_point(data=KCL_human[Type=="CE" & DeltaPsi>0.1 & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="skyblue", alpha=alpha.var, size=size.var) +
geom_point(data=KCL_human[Type=="CE" & DeltaPsi<(-0.1) & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="red", alpha=alpha.var, size=size.var) +
xlim(c(-0.8, 0.8)) +
facet_grid( . ~ G4_bol ) +
xlab("DeltaPSI (Control - KCl)") +
theme_bw()

To highlight NRXN2, SHANK1 and RBM10 we used biomaRt to find the gene name to Ensembl ID correspondence
library(biomaRt)
ensembl = useEnsembl(biomart="ensembl", dataset="hsapiens_gene_ensembl")
KCL_human[ Type=="CE"& DeltaPsi>0.1 & Probability>0.9, ]
chrom start end strand Type DeltaPsi Probability G4.x G4.y G4_bol exon
1: chr1 898717 898884 + CE 0.10456 0.983 0 0 Without G-quadruplex exon
2: chr1 998459 998581 + CE 0.66515 1.000 0 0 Without G-quadruplex exon
3: chr1 1417925 1417994 + CE 0.19193 1.000 0 0 Without G-quadruplex exon
4: chr1 1420396 1420551 + CE 0.11443 0.989 0 1 With G-quadruplex exon
5: chr1 1425072 1425191 + CE 0.25542 0.995 1 0 With G-quadruplex exon
---
2330: chrX 133372809 133372870 + CE 0.36421 0.968 0 0 Without G-quadruplex exon
2331: chrX 149882951 149883001 + CE 0.27179 0.976 0 0 Without G-quadruplex exon
2332: chrX 153224020 153224217 - CE 0.17532 0.999 0 0 Without G-quadruplex exon
2333: chrX 153585619 153585642 - CE 0.24249 0.999 0 0 Without G-quadruplex microexon
2334: chrX 153872153 153872305 - CE 0.19742 0.923 1 0 With G-quadruplex exon
KCL_human[, Coords:=paste(chrom, paste(start, end, sep = "-"), strand, sep=":" )]
whippet.jls.exons.hg19 <- fread("../KCL/whippet.jls.exons.tab")
|--------------------------------------------------|
|==================================================|
KCL_human_CE <- merge(KCL_human[Type=="CE", ], whippet.jls.exons.hg19, by.x="Coords", by.y="Potential_Exon")
KCL_human_CE[ , ensembl_gene_id:=vapply(strsplit(KCL_human_CE$Gene, ".", fixed = TRUE), "[", "", 1)]
KCL_human_CE_genes <- data.table(getBM(attributes=c('ensembl_gene_id', "wikigene_description", "hgnc_symbol"),filters = 'ensembl_gene_id', values = unique(vapply(strsplit(KCL_human_CE$Gene, ".", fixed = TRUE), "[", "", 1)) , mart = ensembl))
KCL_human_CE <- merge(KCL_human_CE, KCL_human_CE_genes, by="ensembl_gene_id")
KCL_human_CE[ hgnc_symbol=="GRIN1", ][ Type=="CE"& DeltaPsi>0.1 & Probability>0.85, ]
Empty data.table (0 rows and 18 cols): ensembl_gene_id,Coords,chrom,start,end,strand...
KCL_human_CE[ hgnc_symbol=="NRXN2", ][ Type=="CE"& DeltaPsi>0.1 & Probability>0.9, ]
ensembl_gene_id Coords chrom start end strand Type DeltaPsi Probability G4.x G4.y G4_bol exon Gene Whippet_Nodes Is_Annotated
1: ENSG00000110076 chr11:64393935-64394024:- chr11 64393935 64394024 - CE 0.10148 0.976 0 0 Without G-quadruplex exon ENSG00000110076.14 41 Y
2: ENSG00000110076 chr11:64421168-64421194:- chr11 64421168 64421194 - CE 0.21315 0.992 3 2 With G-quadruplex microexon ENSG00000110076.14 24 Y
wikigene_description hgnc_symbol
1: neurexin 2 NRXN2
2: neurexin 2 NRXN2
KCL_human_CE[ hgnc_symbol=="SHANK1", ][ Type=="CE"& DeltaPsi>0.1 & Probability>0.85, ]
ensembl_gene_id Coords chrom start end strand Type DeltaPsi Probability G4.x G4.y G4_bol exon Gene Whippet_Nodes Is_Annotated
1: ENSG00000161681 chr19:51190274-51190297:- chr19 51190274 51190297 - CE 0.18128 0.899 2 2 With G-quadruplex microexon ENSG00000161681.11 28 Y
wikigene_description hgnc_symbol
1: SH3 and multiple ankyrin repeat domains 1 SHANK1
KCL_human_CE[ hgnc_symbol=="RBM10", ][ Type=="CE"& DeltaPsi>0.1 & Probability>0.9, ]
ensembl_gene_id Coords chrom start end strand Type DeltaPsi Probability G4.x G4.y G4_bol exon Gene Whippet_Nodes Is_Annotated
1: ENSG00000182872 chrX:47034418-47034491:+ chrX 47034418 47034491 + CE 0.24869 0.989 1 2 With G-quadruplex exon ENSG00000182872.11 9 Y
wikigene_description hgnc_symbol
1: RNA binding motif protein 10 RBM10
library("ggrepel")
package ‘ggrepel’ was built under R version 3.5.2
validation_exons <-c("chr1:110734594-110734835:+", "chr19:17731502-17731531:-", "chr11:20072835-20072879:+")
Fig5.A <- ggplot(data=KCL_human[ Type=="CE",]) +
geom_point( aes(x=-DeltaPsi, y=Probability), colour="grey", alpha=alpha.var, size=size.var) +
geom_point(data=KCL_human[Type=="CE" & DeltaPsi>0.1 & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="skyblue", alpha=alpha.var, size=size.var) +
geom_point(data=KCL_human[Type=="CE" & DeltaPsi<(-0.1) & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="red", alpha=alpha.var, size=size.var) +
xlim(c(-0.8, 0.8)) +
facet_grid( . ~ G4_bol ) +
xlab("DeltaPSI (Control - KCl)") +
theme_bw() +
geom_point(data=KCL_human_CE[Coords %in% validation_exons , ], aes(x=-DeltaPsi, y=Probability), colour="blue", alpha=alpha.var, size=2) +
geom_text_repel(data = KCL_human_CE[Coords %in% validation_exons , ],
colour="black", aes(x=-DeltaPsi, y=Probability),
nudge_y = 3,
direction = "x",
angle = 90,
vjust = 1,
segment.size = 0.2,
label.size = 0.05,
label=KCL_human_CE[Coords %in% validation_exons , hgnc_symbol]) +
ylim(c(0.5, 1.15))
Ignoring unknown parameters: label.size
Fig5.A

To analyse all the Whippet node types, we calculate the odd-ratios of being differentially included given the G4 presence or absence
KCL_human[ , diff:="NA"]
KCL_human[ (DeltaPsi<=-0.1 & Probability>=0.9) , diff:="In"]
KCL_human[ (DeltaPsi>0.1 & Probability>=0.9) , diff:="Ex"]
KCL_human_stats <- merge(KCL_human[ G4_bol=="Without G-quadruplex", .(WO_G4=.N) , by=c("Type", "diff") ],
KCL_human[ G4_bol=="With G-quadruplex", .(W_G4=.N) , by=c("Type", "diff") ],
by=c("Type", "diff"))
KCL_human_stats <- merge(KCL_human_stats[diff!="NA"], KCL_human_stats[diff=="NA" , .(Type, WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_human_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_human_stats[ , OR := W_G4_fraq/WO_G4_fraq]
ggplot(KCL_human_stats) +
geom_tile( aes(Type, diff, fill = log2(OR))) +
scale_fill_gradient2(low="blue", high="red", mid = "grey", midpoint = 0, limits = c(-1.6, 1.6)) +
theme(legend.position = "bottom", legend.direction = "horizontal") +
theme(legend.position = "bottom", legend.direction = "horizontal") + theme(axis.text.x = element_text(angle = 90)) +labs(x = NULL, y = NULL)

We use chi-squared test to calculate the significance
KCL_human_stats.chi <- data.table()
for ( i in unique(KCL_human_stats[Type!="AL"]$Type)){
matrix.ex <- matrix(nrow=2, c(KCL_human_stats[Type==i & diff=="Ex"]$WO_G4_NA, KCL_human_stats[Type==i & diff=="Ex"]$WO_G4, KCL_human_stats[Type==i & diff=="Ex"]$W_G4_NA, KCL_human_stats[Type==i & diff=="Ex"]$W_G4))
matrix.ex_res <- chisq.test(matrix.ex)
matrix.in <- matrix(nrow=2, c(KCL_human_stats[Type==i & diff=="In"]$WO_G4_NA, KCL_human_stats[Type==i & diff=="In"]$WO_G4, KCL_human_stats[Type==i & diff=="In"]$W_G4_NA, KCL_human_stats[Type==i & diff=="In"]$W_G4))
matrix.in_res <- chisq.test(matrix.in)
KCL_human_stats.chi <- rbind(KCL_human_stats.chi, cbind(i, "Ex", matrix.ex_res$p.value))
KCL_human_stats.chi <- rbind(KCL_human_stats.chi, cbind(i, "In", matrix.in_res$p.value))
}
colnames(KCL_human_stats.chi) <- c("Type", "diff", "P_value")
ntest = nrow(KCL_human_stats.chi)
KCL_human_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
KCL_human_stats <- merge(KCL_human_stats, KCL_human_stats.chi, by=c("Type", "diff"))
library(plyr)
ggplot(KCL_human_stats) +
geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

splice_node_dot_plot <- function(upstream.path, downstream.path ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_x <- merge(KCL_x_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
KCL_x_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_x[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[ G4_bol=="Without G-quadruplex", .(WO_G4=.N) , by=c("Type", "diff") ],
KCL_x[ G4_bol=="With G-quadruplex", .(W_G4=.N) , by=c("Type", "diff") ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"], KCL_x_stats[diff=="NA" , .(Type, WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL"]$Type)){
matrix.ex <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="Ex"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.ex_res <- chisq.test(matrix.ex)
matrix.in <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4_NA, KCL_x_stats[Type==i & diff=="In"]$W_G4))
matrix.in_res <- chisq.test(matrix.in)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "Ex", matrix.ex_res$p.value))
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "In", matrix.in_res$p.value))
}
colnames(KCL_x_stats.chi) <- c("Type", "diff", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
ggplot(KCL_x_stats) +
geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
return(KCL_x_stats)
}
upstream.path = "../KCL/MicroExonator/ESC-derived_neuron_CD1.diff.upstream_100nt.G4s"
downstream.path = "../KCL/MicroExonator/ESC-derived_neuron_CD1.diff.downstream_100nt.G4s"
splice_node_dot_plot2 <- function(upstream.path, downstream.path ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4" )
KCL_x <- merge(KCL_x_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
KCL_x_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "G4") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_x[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[ G4_bol=="Without G-quadruplex", .(WO_G4=.N) , by=c("Type", "diff") ],
KCL_x[ G4_bol=="With G-quadruplex", .(W_G4=.N) , by=c("Type", "diff") ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"], KCL_x_stats[diff=="NA" , .(Type, WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL"]$Type)){
matrix <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.res <- chisq.test(matrix)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, matrix.res$p.value))
}
colnames(KCL_x_stats.chi) <- c("Type", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
#KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
#ggplot(KCL_x_stats.chi) +
# geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
# scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
# theme_bw() +
# theme(legend.position = "top", legend.direction = "horizontal")
return(KCL_x_stats.chi)
}
diff_G4_ME_table <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_upstream[ ,dist:=((gstart + (gend- gstart)/2) -w.start ) ]
#KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_downstream[ ,dist:=((gstart + (gend- gstart)/2)) - w.start ]
KCL_x <- merge(KCL_x_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "dist") ],
KCL_x_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "dist") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[ , G4_bol:="Without G-quadruplex"]
KCL_x[strand=="+" & ((dist.x >= -dist_lim & dist.x <= 0) | ( dist.y >=0 & dist.y<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x[strand=="-" & ((dist.y >= -dist_lim & dist.y <= 0) | ( dist.x >=0 & dist.x<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x <- KCL_x[Type=="CE"]
KCL_x[ , exon_class:="exon"]
KCL_x[end-start<=30, exon_class:="microexon" ]
return(KCL_x)
}
upstream.path = "../Exons_G4s/human.exons.tvs.upstream.G4seq_K"
downstream.path = "../Exons_G4s/human.exons.tvs.downstream.G4seq_K"
G4_ME_table <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c( "chrom", "sstart", "send", "sstrand", "start", "end", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_upstream[ ,dist:=(sstart - (gstart + (gend- gstart)/2)) ]
#KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <- c( "chrom", "sstart", "send", "strand", "start", "end", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_downstream[ ,dist:=(sstart - (gstart + (gend- gstart)/2)) ]
KCL_x <- merge(KCL_x_upstream[, c( "chrom", "start", "end", "strand", "dist") ],
KCL_x_downstream[, c( "chrom", "start", "end", "strand", "dist") ],
by=c( "chrom", "start", "end", "strand") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[ , G4_bol:="Without G-quadruplex"]
KCL_x[ strand=="+" & ((dist.x >= -dist_lim & dist.x <= 0) | ( dist.y >=0 & dist.y<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x[ strand=="-" & ((dist.y >= -dist_lim & dist.y <= 0) | ( dist.x >=0 & dist.x<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , exon_class:="exon"]
KCL_x[end-start<=30, exon_class:="microexon" ]
return(KCL_x)
}
human.exons.upstream.G4s.300.stats <-human.exons.upstream.G4s.300[ exon_len<=150, .N , by= c("bin", "G4_bol") ]
Error in eval(bysub, xss, parent.frame()) : object 'bin' not found
human.exons.downstream.G4s <- fread("../Exons_G4s/human.exons.tvs.downstream.G4seq_PDS")
colnames(human.exons.downstream.G4s) <- c( "chrom", "sstart", "send", "sstrand", "start", "end", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
human.exons.downstream.G4s[ ,dist:=( (gstart + (gend- gstart)/2) - sstart) ]
human.exons.downstream.G4s[ sstrand=="-", dist:=( sstart - (gstart + (gend- gstart)/2)) ]
human.exons.downstream.G4s[, exon_len:=end-start]
human.exons.downstream.G4s[ , G4_bol:="Without G-quadruplex"]
human.exons.downstream.G4s[ dist<=100 & dist>=0 , G4_bol:="With G-quadruplex"]
human.exons.downstream.G4s[, exon_class:="exon"]
human.exons.downstream.G4s[ exon_len<=30, exon_class:="microexon"]
human.exons.downstream.G4s.2x2 <- matrix(ncol = 2,
c(nrow(human.exons.downstream.G4s[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test(human.exons.downstream.G4s.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: human.exons.downstream.G4s.2x2
X-squared = 8.2286, df = 1, p-value = 0.004123
human.exons.downstream.G4s[ , ID:=paste(chrom, start, end, sep="_" )]
human.exons.downstream.G4s[, filter:="Out"]
human.exons.downstream.G4s[ ID %in% KCL_human_CE, filter:="In"]
human.exons.downstream.G4s <- human.exons.downstream.G4s[ ID %in% KCL_human_CE, ]
human.exons.downstream.G4s.stats <-human.exons.downstream.G4s[ exon_len<=300, .N , by= c("exon_len", "G4_bol") ]
human.exons.downstream.G4s.stats[, Total:=sum(N), by=exon_len]
human.exons.downstream.G4s.stats[, Percentage:=N*100/Total]
human.exons.downstream.G4s$G4_bol <- factor(human.exons.downstream.G4s$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex"))
ggplot(human.exons.downstream.G4s) +
geom_bar(aes(x=exon_len, fill=G4_bol), position = "fill" ) +
xlim(c(1, 300)) +
geom_vline(xintercept = 30, linetype="dashed", colour="red") +
ylim(c(0, 0.1))

ggplot(human.exons.downstream.G4s.stats[G4_bol=="With G-quadruplex"]) +
geom_bar(aes(x=exon_len, y=Percentage), stat = "identity" ) +
xlim(c(1, 300)) +
geom_vline(xintercept = 30, linetype="dashed", colour="red")

ggplot(human.exons.upstream.G4s) +
geom_bar(aes(x=exon_len, fill=G4_bol), position = "fill" ) +
xlim(c(1, 150)) +
geom_vline(xintercept = 30) +
ylim(c(0.8, 1))

ggplot(hg19_ME_table_G4s) +
geom_boxplot(aes(G4_bol, exon_len)) +
ylim(c(0, 300))

hg19_ME_table_K[, exon_len:=end-start]
ggplot(hg19_ME_table_K) +
geom_boxplot(aes(G4_bol, exon_len)) +
ylim(c(0, 300))

hg19_ME_table_G4s[, median(exon_len), by=G4_bol]
G4_bol V1
1: Without G-quadruplex 147
2: With G-quadruplex 174
hg19_ME_table_K[, median(exon_len), by=G4_bol]
G4_bol V1
1: Without G-quadruplex 147
2: With G-quadruplex 183
ggplot(hg19_ME_table_PDS) +
geom_boxplot(aes(G4_bol, exon_len)) +
ylim(c(0, 300))
Error in FUN(X[[i]], ...) : object 'exon_len' not found

human.ME_g4.stats <- data.table()
hg19_ME_table_G4s <- G4_ME_table("../Exons_G4s/human.exons.tvs.upstream.G4s" , "../Exons_G4s/human.exons.tvs.downstream.G4s", 100 )
hg19_ME_table_G4s.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_G4s[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
hg19_ME_table_G4s[ , exon_len:=end-start]
colnames(hg19_ME_table_G4s.2x2) <- c("exon", "microexon")
rownames(hg19_ME_table_G4s.2x2) <- c("Without G-quadruplex", "With G-quadruplex")
human.ME_g4.stats <- rbind(human.ME_g4.stats,
cbind(
"motif",
chisq.test( hg19_ME_table_G4s.2x2)$p.value,
(hg19_ME_table_G4s.2x2[ 2 , 2 ]/hg19_ME_table_G4s.2x2[ 1 , 2 ]) / (hg19_ME_table_G4s.2x2[ 2 , 1 ]/hg19_ME_table_G4s.2x2[ 1 , 1 ])
))
hg19_ME_table_K <- G4_ME_table("../Exons_G4s/human.exons.tvs.upstream.G4seq_K" , "../Exons_G4s/human.exons.tvs.downstream.G4seq_K", 100 )
hg19_ME_table_K.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_K[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( hg19_ME_table_K.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: hg19_ME_table_K.2x2
X-squared = 775.72, df = 1, p-value < 2.2e-16
human.ME_g4.stats <- rbind(human.ME_g4.stats,
cbind(
"K+",
chisq.test( hg19_ME_table_K.2x2)$p.value,
(hg19_ME_table_K.2x2[ 2 , 2 ]/hg19_ME_table_K.2x2[ 1 , 2 ]) / (hg19_ME_table_K.2x2[ 2 , 1 ]/hg19_ME_table_K.2x2[ 1 , 1 ])
))
hg19_ME_table_PDS <- G4_ME_table("../Exons_G4s/human.exons.tvs.upstream.G4seq_PDS" , "../Exons_G4s/human.exons.tvs.downstream.G4seq_PDS", 100 )
hg19_ME_table_PDS.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_PDS[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( hg19_ME_table_PDS.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: hg19_ME_table_PDS.2x2
X-squared = 1311.3, df = 1, p-value < 2.2e-16
human.ME_g4.stats <- rbind(human.ME_g4.stats,
cbind(
"PDS",
chisq.test( hg19_ME_table_PDS.2x2)$p.value,
(hg19_ME_table_PDS.2x2[ 2 , 2 ]/hg19_ME_table_PDS.2x2[ 1 , 2 ]) / (hg19_ME_table_PDS.2x2[ 2 , 1 ]/hg19_ME_table_PDS.2x2[ 1 , 1 ])
))
colnames(human.ME_g4.stats) <- c("G4_signal", "p.value", "OR")
human.ME_g4.stats[, P_value.Bonferroni:=as.numeric(p.value)*3]
ggplot(human.ME_g4.stats) +
geom_point(aes(G4_signal, log2(as.numeric(OR)), size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05 ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

primary_cortical_neuron_DIV4_CD1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K", 100 )
ESC_derived_neuron_CD1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV10_CD1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV10_Tc1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_K", 100 )
total_mouse_K_ME_table <- unique(rbind(primary_cortical_neuron_DIV4_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
ESC_derived_neuron_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_Tc1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")]))
total_mouse_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(total_mouse_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( total_mouse_K_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: total_mouse_K_ME_table.2x2
X-squared = 1.9867, df = 1, p-value = 0.1587
colnames(total_mouse_K_ME_table.2x2) <- c("exon", "microexon")
rownames(total_mouse_K_ME_table.2x2) <- c("Without G-quadruplex", "With G-quadruplex")
primary_cortical_neuron_DIV4_CD1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_PDS", 100 )
ESC_derived_neuron_CD1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV10_CD1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_PDS", 100 )
total_mouse_PDS_ME_table <- unique(rbind(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
ESC_derived_neuron_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")]))
total_mouse_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(total_mouse_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( total_mouse_PDS_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: total_mouse_PDS_ME_table.2x2
X-squared = 3.915e-27, df = 1, p-value = 1
KCL_human[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV4_CD1_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4s.fix" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4s.fix", 100 )
ESC_derived_neuron_CD1_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4s.fix" , "../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4s.fix", 100 )
primary_cortical_neuron_DIV10_CD1_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4s.fix" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4s.fix", 100 )
primary_cortical_neuron_DIV10_Tc1_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4s.fix" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4s.fix", 100 )
primary_cortical_neuron_DIV4_CD1_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
ESC_derived_neuron_CD1_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_CD1_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_Tc1_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV4_CD1_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
ESC_derived_neuron_CD1_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_CD1_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_Tc1_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV4_CD1_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
ESC_derived_neuron_CD1_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_CD1_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
All_mouse <- data.table(unique(c(primary_cortical_neuron_DIV4_CD1_K_ME_table[G4_bol=="With G-quadruplex", ID],
ESC_derived_neuron_CD1_K_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_CD1_K_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_Tc1_K_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV4_CD1_PDS_ME_table[G4_bol=="With G-quadruplex", ID],
ESC_derived_neuron_CD1_PDS_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_CD1_PDS_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV4_CD1_motif_ME_table[G4_bol=="With G-quadruplex", ID],
ESC_derived_neuron_CD1_motif_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_CD1_motif_ME_table[G4_bol=="With G-quadruplex", ID],
primary_cortical_neuron_DIV10_Tc1_motif_ME_table[G4_bol=="With G-quadruplex", ID])))
colnames(All_mouse) <- "ID"
All_mouse[ ID %in% primary_cortical_neuron_DIV4_CD1_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV4_CD1_motif:=TRUE ]
All_mouse[ ID %in% ESC_derived_neuron_CD1_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], ESC_derived_neuron_CD1_motif:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_CD1_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_CD1_motif:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_Tc1_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_Tc1_motif:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV4_CD1_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV4_CD1_K:=TRUE ]
All_mouse[ ID %in% ESC_derived_neuron_CD1_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], ESC_derived_neuron_CD1_K:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_CD1_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_CD1_K:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_Tc1_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_Tc1_K:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV4_CD1_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV4_CD1_PDS:=TRUE ]
All_mouse[ ID %in% ESC_derived_neuron_CD1_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], ESC_derived_neuron_CD1_PDS:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_CD1_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_CD1_PDS:=TRUE ]
All_mouse[ ID %in% primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], primary_cortical_neuron_DIV10_Tc1_PDS:=TRUE ]
All_mouse <- cbind(All_mouse, rowSums(is.na(All_mouse)))
fwrite(All_mouse[order(V2)], "../potassium_experiments/Total_mouse.txt", na="FALSE", sep = "\t", quote=F)
human_motif_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4s" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4s", 100 )
human_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
human_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_PDS", 100 )
human_motif_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
human_K_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
human_PDS_ME_table[, ID:=paste( chrom, strand, start, end , sep="_")]
All_human<- data.table(unique(c(
human_motif_ME_table[G4_bol=="With G-quadruplex", ID],
human_K_ME_table[G4_bol=="With G-quadruplex", ID],
human_PDS_ME_table[G4_bol=="With G-quadruplex", ID])))
colnames(All_human) <- "ID"
All_human[ ID %in% human_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_motif:=TRUE ]
All_human[ ID %in% human_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_K:=TRUE ]
All_human[ ID %in% human_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_:=TRUE ]
All_human <- cbind(All_human, rowSums(is.na(All_human)))
fwrite(All_human[order(V2)], "../potassium_experiments/Total_human.txt", na="FALSE", sep = "\t", quote=F)
Not working
human_mouse <- fread("../potassium_experiments/human_mouse.0.2.exons")
colnames(human_mouse) <- c("hID", "mID", "score_index")
All_human.mouse <- merge(All_human, human_mouse, by.x="ID", by.y="hID")
All_human.mouse <- merge(All_human.mouse, All_mouse, by.x = "mID", by.y="ID")
All_human.mouse.diff <- All_human.mouse[V2.y<12 & V2.x<3 ]
All_human.mouse.diff
KCL_human_CE[, ID:=paste( chrom, strand, start, end , sep="_")]
All_human.mouse.diff.gene <- merge(All_human.mouse.diff, KCL_human_CE, by="ID")
View(All_human.mouse.diff.gene[order(V2.y, V2.x )][, c("ID", "mID", "V2.x", "V2.y", "wikigene_description", "hgnc_symbol")] )
cat(All_human.mouse.diff.gene[, hgnc_symbol], sep="\n")
fwrite(All_human.mouse.diff.gene[order(V2.y, V2.x )][, c("ID", "V2.x", "V2.y", "wikigene_description", "hgnc_symbol")], "../potassium_experiments/human.mouse.diff.G4.gene.txt", na="FALSE", sep = "\t", quote=F)
KCL_human[ID=""]
Error in `[.data.table`(KCL_human, ID = "") : unused argument (ID = "")
total_mouse_PDS_ME_table[G4_bol=="With G-quadruplex", mean(exon_len) ]
Error in mean(exon_len) : object 'exon_len' not found
primary_cortical_neuron_DIV4_CD1_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2
X-squared = 2.0509, df = 1, p-value = 0.1521
primary_cortical_neuron_DIV4_CD1_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2
X-squared = 1.0594, df = 1, p-value = 0.3034
Control_vs_KCL_K_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_K" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
Control_vs_KCL_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(Control_vs_KCL_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( Control_vs_KCL_K_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: Control_vs_KCL_K_ME_table.2x2
X-squared = 0.026068, df = 1, p-value = 0.8717
Control_vs_KCL_PDS_ME_table <- diff_G4_ME_table("../KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_PDS" , "../KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
Control_vs_KCL_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( Control_vs_KCL_PDS_ME_table.2x2)
Pearson's Chi-squared test with Yates' continuity correction
data: Control_vs_KCL_PDS_ME_table.2x2
X-squared = 10.324, df = 1, p-value = 0.001313
splice_node_dot_plot3 <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_upstream[ ,dist:=abs(w.start - (gstart + (gend- gstart)/2)) ]
KCL_x_downstream<- fread(downstream.path )
colnames(KCL_x_downstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist" )
KCL_x_downstream[ ,dist:=abs(w.start - (gstart + (gend- gstart)/2)) ]
KCL_x <- merge(KCL_x_upstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "dist") ],
KCL_x_downstream[, c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability", "dist") ],
by=c("chrom", "start", "end", "strand", "Type" , "DeltaPsi", "Probability") )
#KCL_x <- KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x[(dist.x>dist_lim & dist.y>dist_lim ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[ G4_bol=="Without G-quadruplex", .(WO_G4=.N) , by=c("Type", "diff") ],
KCL_x[ G4_bol=="With G-quadruplex", .(W_G4=.N) , by=c("Type", "diff") ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"], KCL_x_stats[diff=="NA" , .(Type, WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL"]$Type)){
matrix.ex <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="Ex"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.ex_res <- chisq.test(matrix.ex, correct=TRUE)
matrix.in <- matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4_NA, KCL_x_stats[Type==i & diff=="In"]$W_G4))
matrix.in_res <- chisq.test(matrix.in, correct=TRUE)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "Ex", matrix.ex_res$p.value))
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "In", matrix.in_res$p.value))
}
colnames(KCL_x_stats.chi) <- c("Type", "diff", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
ggplot(KCL_x_stats) +
geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
return(KCL_x_stats)
}
test <- fread("../KCL/MicroExonator/Control_vs_KCL.diff.upstream_100nt.G4s")
AQ1
AQ1.2.PDS
Error: object 'AQ1.2.PDS' not found
PDS
HEK.PDS.motif <- splice_node_dot_plot3("../PDS_cPDS/closest/Control_vs_PDS_HEK.diff.upstream.G4s",
"../PDS_cPDS/closest/Control_vs_PDS_HEK.diff.downstream.G4s",
100)
Chi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrect
AQ1.K <- splice_node_dot_plot3("../AQ1/Control_vs_1mu.diff.downstream.G4seq_K",
"../AQ1/Control_vs_1mu.diff.upstream.G4seq_K",
100)
AQ1.PDS <- splice_node_dot_plot3("../AQ1/Control_vs_1mu.diff.downstream.G4seq_PDS",
"../AQ1/Control_vs_1mu.diff.upstream.G4seq_PDS",
100)

supp.dotplot.A <- splice_node_dot_plot2("../KCL/MicroExonator/ESC-derived_neuron_CD1.diff.upstream_100nt.G4s", "../KCL/MicroExonator/ESC-derived_neuron_CD1.diff.downstream_100nt.G4s" )
ESC_derived_neuron_CD1.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4s.fix",
"../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4s.fix",
100)
Chi-squared approximation may be incorrect
ESC_derived_neuron_CD1.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_K",
45)
Chi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrect
ESC_derived_neuron_CD1.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_PDS",
45)
ESC_derived_neuron_CD1.motif[ , G4_signal:="Motif" ]
ESC_derived_neuron_CD1.K[ , G4_signal:="K+" ]
ESC_derived_neuron_CD1.PDS[ , G4_signal:="PDS" ]
ESC_derived_neuron_CD1.motif_K_PDS <- rbind(ESC_derived_neuron_CD1.motif, ESC_derived_neuron_CD1.K, ESC_derived_neuron_CD1.PDS)
ESC_derived_neuron_CD1.motif_K_PDS$G4_signal <- factor(ESC_derived_neuron_CD1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(ESC_derived_neuron_CD1.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
ylab("") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

supp.dotplot.C <- splice_node_dot_plot2("../KCL/MicroExonator/primary_cortical_neuron_DIV10_CD1.diff.upstream_100nt.G4s", "../KCL/MicroExonator/primary_cortical_neuron_DIV10_CD1.diff.downstream_100nt.G4s" )
primary_cortical_neuron_DIV10_CD1.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4s.fix",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4s.fix",
100)
primary_cortical_neuron_DIV10_CD1.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_K",
45)
Chi-squared approximation may be incorrect
primary_cortical_neuron_DIV10_CD1.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_PDS",
45)
primary_cortical_neuron_DIV10_CD1.motif[ , G4_signal:="Motif" ]
primary_cortical_neuron_DIV10_CD1.K[ , G4_signal:="K+" ]
primary_cortical_neuron_DIV10_CD1.PDS[ , G4_signal:="PDS" ]
primary_cortical_neuron_DIV10_CD1.motif_K_PDS <- rbind(primary_cortical_neuron_DIV10_CD1.motif, primary_cortical_neuron_DIV10_CD1.K, primary_cortical_neuron_DIV10_CD1.PDS)
primary_cortical_neuron_DIV10_CD1.motif_K_PDS$G4_signal <- factor(primary_cortical_neuron_DIV10_CD1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(primary_cortical_neuron_DIV10_CD1.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
ylab("") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

supp.dotplot.D <- splice_node_dot_plot2("../KCL/MicroExonator/primary_cortical_neuron_DIV10_Tc1.diff.upstream_100nt.G4s", "../KCL/MicroExonator/primary_cortical_neuron_DIV10_Tc1.diff.downstream_100nt.G4s" )
primary_cortical_neuron_DIV10_Tc1.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4s.fix",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4s.fix",
100)
primary_cortical_neuron_DIV10_Tc1.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_K",
45)
primary_cortical_neuron_DIV10_Tc1.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_PDS",
45)
primary_cortical_neuron_DIV10_Tc1.motif[ , G4_signal:="Motif" ]
primary_cortical_neuron_DIV10_Tc1.K[ , G4_signal:="K+" ]
primary_cortical_neuron_DIV10_Tc1.PDS[ , G4_signal:="PDS" ]
primary_cortical_neuron_DIV10_Tc1.motif_K_PDS <- rbind(primary_cortical_neuron_DIV10_Tc1.motif, primary_cortical_neuron_DIV10_Tc1.K, primary_cortical_neuron_DIV10_Tc1.PDS)
primary_cortical_neuron_DIV10_Tc1.motif_K_PDS$G4_signal <- factor(primary_cortical_neuron_DIV10_Tc1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(primary_cortical_neuron_DIV10_Tc1.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
ylab("") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

supp.dotplot.B <- splice_node_dot_plot2("../KCL/MicroExonator/primary_cortical_neuron_DIV4_CD1.diff.upstream_100nt.G4s", "../KCL/MicroExonator/primary_cortical_neuron_DIV4_CD1.diff.downstream_100nt.G4s" )
primary_cortical_neuron_DIV4_CD1.motif <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4s.fix",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4s.fix",
100)
primary_cortical_neuron_DIV4_CD1.K <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K",
45)
Chi-squared approximation may be incorrect
primary_cortical_neuron_DIV4_CD1.PDS <- splice_node_dot_plot3("../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_PDS",
"../KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_PDS",
45)
primary_cortical_neuron_DIV4_CD1.motif[ , G4_signal:="Motif" ]
primary_cortical_neuron_DIV4_CD1.K[ , G4_signal:="K+" ]
primary_cortical_neuron_DIV4_CD1.PDS[ , G4_signal:="PDS" ]
primary_cortical_neuron_DIV4_CD1.motif_K_PDS <- rbind(primary_cortical_neuron_DIV4_CD1.motif, primary_cortical_neuron_DIV4_CD1.K, primary_cortical_neuron_DIV4_CD1.PDS)
primary_cortical_neuron_DIV4_CD1.motif_K_PDS$G4_signal <- factor(primary_cortical_neuron_DIV4_CD1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(primary_cortical_neuron_DIV4_CD1.motif_K_PDS) +
geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
facet_grid(G4_signal ~ .) +
ylab("") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

KCL_human[(DeltaPsi<=-0.1 & Probability>0.9), Delta_type:="Included"]
KCL_human[(DeltaPsi>=0.1 & Probability>0.9), Delta_type:="Skiped"]
KCL_human[is.na(Delta_type), Delta_type:="None"]
KCL_human_stats <- KCL_human[Type=="CE" , .(count=.N), by=c("Delta_type", "exon", "G4_bol") ]
KCL_human_stats[, total:=sum(count), by="G4_bol"]
KCL_human_stats[, fraction:=count/total]
Fig5.B <- ggplot() +
geom_bar(data=KCL_human_stats[Delta_type!="None" & exon=="exon", ] , aes(x= G4_bol, y=fraction, group=Delta_type, fill=Delta_type ) , position="dodge", stat="identity" ) +
xlab("") +
ylab("Fraction of differentially inclued exons ") +
theme_bw() +
guides(fill=guide_legend(title="Alternative splicing event")) +
theme(legend.position = "top", legend.direction = "horizontal")
Fig5.B

diff.up <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
diff.down <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
eql.up <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
eql.down <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
.default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col expected actual file
2 -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
diff.up[, `:=`(type="diff", pos="up" )]
diff.down[, `:=`(type="diff", pos="down" )]
eql.up[, `:=`(type="eql", pos="up" )]
eql.down[, `:=`(type="eql", pos="down" )]
diff_eql <- rbind(diff.up, diff.down, eql.up, eql.down)
ggplot(diff_eql) +
geom_line(aes(x=Position, y=Enrrichment, group=type)) +
facet_grid(pos ~ .) +
theme_bw()

plot_eql_diff <- function(eql_up_plus, eql_up_minus, eql_down_plus, eql_down_minus, diff_up_plus, diff_up_minus, diff_down_plus, diff_down_minus ){
diff.up_plus <- read_dist_table(diff_up_plus)
diff.up_minus <- read_dist_table(diff_up_minus)
diff.down_plus <- read_dist_table(diff_down_plus)
diff.down_minus <- read_dist_table(diff_down_minus)
diff.up_minus[,Position:=Position*-1]
diff.down_minus[,Position:=Position*-1]
diff.TOTAL <- plot_density(diff.up_plus, diff.up_minus, diff.down_plus, diff.down_minus)
eql.up_plus <- read_dist_table(eql_up_plus)
eql.up_minus <- read_dist_table(eql_up_minus)
eql.down_plus <- read_dist_table(eql_down_plus)
eql.down_minus <- read_dist_table(eql_down_minus)
eql.up_minus[,Position:=Position*-1]
eql.down_minus[,Position:=Position*-1]
eql.TOTAL <- plot_density(eql.up_plus, eql.up_minus, eql.down_plus, eql.down_minus)
diff.TOTAL[, type:="diff"]
eql.TOTAL[, type:="eql"]
diff_eql.TOTAL <- rbind(diff.TOTAL, eql.TOTAL)
ggplot(diff_eql.TOTAL) +
geom_line(aes(x=Position, y=Enrrichment, color=type)) +
xlim(c(-250,250)) +
facet_grid(. ~ exon_pos ) +
labs(colour = "Potassium effect") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")
}
plot_eql_diff_binomial <- function(eql_up_plus, eql_up_minus, eql_down_plus, eql_down_minus, diff_up_plus, diff_up_minus, diff_down_plus, diff_down_minus, TOTAL.eql, TOTAL.diff, sig ){
diff.up_plus <- read_dist_table(diff_up_plus)
diff.up_minus <- read_dist_table(diff_up_minus)
diff.down_plus <- read_dist_table(diff_down_plus)
diff.down_minus <- read_dist_table(diff_down_minus)
diff.up_minus[,Position:=Position*-1]
diff.down_minus[,Position:=Position*-1]
diff.TOTAL <- plot_density_binomial(diff.up_plus, diff.up_minus, diff.down_plus, diff.down_minus, TOTAL.diff, sig)
eql.up_plus <- read_dist_table(eql_up_plus)
eql.up_minus <- read_dist_table(eql_up_minus)
eql.down_plus <- read_dist_table(eql_down_plus)
eql.down_minus <- read_dist_table(eql_down_minus)
eql.up_minus[,Position:=Position*-1]
eql.down_minus[,Position:=Position*-1]
eql.TOTAL <- plot_density_binomial(eql.up_plus, eql.up_minus, eql.down_plus, eql.down_minus, TOTAL.eql, sig)
diff.TOTAL[, type:="diff"]
eql.TOTAL[, type:="eql"]
diff_eql.TOTAL <- rbind(diff.TOTAL, eql.TOTAL)
ggplot(diff_eql.TOTAL) +
geom_line(aes(x=Position, y=Enrrichment, color=type)) +
geom_ribbon(aes(ymin=Enrrichment_l, ymax=Enrrichment_u, x=Position, fill=type), alpha=0.3 )+
xlim(c(-250,250)) +
facet_grid(. ~ exon_pos ) +
labs(colour = "Potassium effect") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
scale_fill_manual(values=c("#669900", "grey")) +
scale_color_manual(values=c("#669900", "darkgrey"))
}
KCL_human <- fread("../KCL/MicroExonator/Control_vs_KCL.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_human <- KCL_human[, 1:11]
colnames(KCL_human) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
human.CE.NA <- nrow(KCL_human[(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
human.CE.diff <- nrow(KCL_human[abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
KCL_ESC_derived_neuron_CD1 <- fread("../KCL/MicroExonator/ESC-derived_neuron_CD1.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_ESC_derived_neuron_CD1 <- KCL_ESC_derived_neuron_CD1 [, 1:11]
colnames(KCL_ESC_derived_neuron_CD1 ) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
ESC_derived_neuron_CD1.CE.NA <- nrow(KCL_ESC_derived_neuron_CD1 [(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
ESC_derived_neuron_CD1.CE.diff <- nrow(KCL_ESC_derived_neuron_CD1[abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
KCL_primary_cortical_neuron_DIV10_Tc1 <- fread("../KCL/MicroExonator/primary_cortical_neuron_DIV10_Tc1.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_primary_cortical_neuron_DIV10_Tc1 <- KCL_primary_cortical_neuron_DIV10_Tc1 [, 1:11]
colnames(KCL_primary_cortical_neuron_DIV10_Tc1 ) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
primary_cortical_neuron_DIV10_Tc1.CE.NA <- nrow(KCL_primary_cortical_neuron_DIV10_Tc1 [(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
primary_cortical_neuron_DIV10_Tc1.CE.diff <- nrow(KCL_primary_cortical_neuron_DIV10_Tc1 [abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
KCL_primary_cortical_neuron_DIV4_CD1 <- fread("../KCL/MicroExonator/primary_cortical_neuron_DIV4_CD1.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_primary_cortical_neuron_DIV4_CD1 <- KCL_primary_cortical_neuron_DIV4_CD1 [, 1:11]
colnames(KCL_primary_cortical_neuron_DIV4_CD1 ) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
primary_cortical_neuron_DIV4_CD1.CE.NA <- nrow(KCL_primary_cortical_neuron_DIV4_CD1 [(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
primary_cortical_neuron_DIV4_CD1.CE.diff <- nrow(KCL_primary_cortical_neuron_DIV4_CD1 [abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
KCL_primary_cortical_neuron_DIV10_CD1 <- fread("../KCL/MicroExonator/primary_cortical_neuron_DIV10_CD1.diff", sep="\t")
Detected 11 column names but the data has 12 columns (i.e. invalid file). Added 1 extra default column name for the first column which is guessed to be row names or an index. Use setnames() afterwards if this guess is not correct, or fix the file write command that created the file to create a valid file.
KCL_primary_cortical_neuron_DIV10_CD1 <- KCL_primary_cortical_neuron_DIV10_CD1 [, 1:11]
colnames(KCL_primary_cortical_neuron_DIV10_CD1 ) <- c("Gene","Node", "Coord", "Strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "Complexity", "Entropy")
primary_cortical_neuron_DIV10_CD1.CE.NA <- nrow(KCL_primary_cortical_neuron_DIV10_CD1 [(abs(DeltaPsi)<0.1 | Probability<0.9) & Type=="CE"])
primary_cortical_neuron_DIV10_CD1.CE.diff <- nrow(KCL_primary_cortical_neuron_DIV10_CD1[abs(DeltaPsi)>=0.1 & Probability>=0.9 & Type=="CE"])
plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_less.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_less.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_less.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_less.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
ESC_derived_neuron_CD1.CE.NA,
ESC_derived_neuron_CD1.CE.diff,
0.05)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_Tc1.CE.NA,
primary_cortical_neuron_DIV10_Tc1.CE.diff,
0.05)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV4_CD1.CE.NA,
primary_cortical_neuron_DIV4_CD1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_CD1.CE.NA,
primary_cortical_neuron_DIV10_CD1.CE.diff,
0.05)



G4seq
plot_eql_diff(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num"
)



Fig5.C <- plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05)


Fig5.c <- Fig5.C +ylim( c(0.4, 2.1))
Fig5.c

Fig5.D <- plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05
)


Fig5.D <- Fig5.D +ylim( c(0.4, 2.1))
Fig5.D

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
ESC_derived_neuron_CD1.CE.NA,
ESC_derived_neuron_CD1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
ESC_derived_neuron_CD1.CE.NA,
ESC_derived_neuron_CD1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_CD1.CE.NA,
primary_cortical_neuron_DIV10_CD1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_CD1.CE.NA,
primary_cortical_neuron_DIV10_CD1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_Tc1.CE.NA,
primary_cortical_neuron_DIV10_Tc1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_Tc1.CE.NA,
primary_cortical_neuron_DIV10_Tc1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV4_CD1.CE.NA,
primary_cortical_neuron_DIV4_CD1.CE.diff,
0.05
)



plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV4_CD1.CE.NA,
primary_cortical_neuron_DIV4_CD1.CE.diff,
0.05
)



smooth
rep(1:1999, each=4)
[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12
[48] 12 13 13 13 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24
[95] 24 24 25 25 25 25 26 26 26 26 27 27 27 27 28 28 28 28 29 29 29 29 30 30 30 30 31 31 31 31 32 32 32 32 33 33 33 33 34 34 34 34 35 35 35 35 36
[142] 36 36 36 37 37 37 37 38 38 38 38 39 39 39 39 40 40 40 40 41 41 41 41 42 42 42 42 43 43 43 43 44 44 44 44 45 45 45 45 46 46 46 46 47 47 47 47
[189] 48 48 48 48 49 49 49 49 50 50 50 50 51 51 51 51 52 52 52 52 53 53 53 53 54 54 54 54 55 55 55 55 56 56 56 56 57 57 57 57 58 58 58 58 59 59 59
[236] 59 60 60 60 60 61 61 61 61 62 62 62 62 63 63 63 63 64 64 64 64 65 65 65 65 66 66 66 66 67 67 67 67 68 68 68 68 69 69 69 69 70 70 70 70 71 71
[283] 71 71 72 72 72 72 73 73 73 73 74 74 74 74 75 75 75 75 76 76 76 76 77 77 77 77 78 78 78 78 79 79 79 79 80 80 80 80 81 81 81 81 82 82 82 82 83
[330] 83 83 83 84 84 84 84 85 85 85 85 86 86 86 86 87 87 87 87 88 88 88 88 89 89 89 89 90 90 90 90 91 91 91 91 92 92 92 92 93 93 93 93 94 94 94 94
[377] 95 95 95 95 96 96 96 96 97 97 97 97 98 98 98 98 99 99 99 99 100 100 100 100 101 101 101 101 102 102 102 102 103 103 103 103 104 104 104 104 105 105 105 105 106 106 106
[424] 106 107 107 107 107 108 108 108 108 109 109 109 109 110 110 110 110 111 111 111 111 112 112 112 112 113 113 113 113 114 114 114 114 115 115 115 115 116 116 116 116 117 117 117 117 118 118
[471] 118 118 119 119 119 119 120 120 120 120 121 121 121 121 122 122 122 122 123 123 123 123 124 124 124 124 125 125 125 125 126 126 126 126 127 127 127 127 128 128 128 128 129 129 129 129 130
[518] 130 130 130 131 131 131 131 132 132 132 132 133 133 133 133 134 134 134 134 135 135 135 135 136 136 136 136 137 137 137 137 138 138 138 138 139 139 139 139 140 140 140 140 141 141 141 141
[565] 142 142 142 142 143 143 143 143 144 144 144 144 145 145 145 145 146 146 146 146 147 147 147 147 148 148 148 148 149 149 149 149 150 150 150 150 151 151 151 151 152 152 152 152 153 153 153
[612] 153 154 154 154 154 155 155 155 155 156 156 156 156 157 157 157 157 158 158 158 158 159 159 159 159 160 160 160 160 161 161 161 161 162 162 162 162 163 163 163 163 164 164 164 164 165 165
[659] 165 165 166 166 166 166 167 167 167 167 168 168 168 168 169 169 169 169 170 170 170 170 171 171 171 171 172 172 172 172 173 173 173 173 174 174 174 174 175 175 175 175 176 176 176 176 177
[706] 177 177 177 178 178 178 178 179 179 179 179 180 180 180 180 181 181 181 181 182 182 182 182 183 183 183 183 184 184 184 184 185 185 185 185 186 186 186 186 187 187 187 187 188 188 188 188
[753] 189 189 189 189 190 190 190 190 191 191 191 191 192 192 192 192 193 193 193 193 194 194 194 194 195 195 195 195 196 196 196 196 197 197 197 197 198 198 198 198 199 199 199 199 200 200 200
[800] 200 201 201 201 201 202 202 202 202 203 203 203 203 204 204 204 204 205 205 205 205 206 206 206 206 207 207 207 207 208 208 208 208 209 209 209 209 210 210 210 210 211 211 211 211 212 212
[847] 212 212 213 213 213 213 214 214 214 214 215 215 215 215 216 216 216 216 217 217 217 217 218 218 218 218 219 219 219 219 220 220 220 220 221 221 221 221 222 222 222 222 223 223 223 223 224
[894] 224 224 224 225 225 225 225 226 226 226 226 227 227 227 227 228 228 228 228 229 229 229 229 230 230 230 230 231 231 231 231 232 232 232 232 233 233 233 233 234 234 234 234 235 235 235 235
[941] 236 236 236 236 237 237 237 237 238 238 238 238 239 239 239 239 240 240 240 240 241 241 241 241 242 242 242 242 243 243 243 243 244 244 244 244 245 245 245 245 246 246 246 246 247 247 247
[988] 247 248 248 248 248 249 249 249 249 250 250 250 250
[ reached getOption("max.print") -- omitted 6996 entries ]
diff_eql.TOTAL[ , bin:=rep(1:1999, each=4) ]
diff_eql.TOTAL[, mean_Enrrichment:=mean(Enrrichment) , by=bin]
ggplot(diff_eql.TOTAL) +
geom_line(aes(x=Position, y=mean_Enrrichment, color=type)) +
xlim(c(-250,250)) +
facet_grid(. ~ exon_pos ) +
labs(colour = "Potassium effect") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal")

Intron lenght
intron_upstream <- fread("../Figures/Figure3/Introns.hg19_upstream_100nt_window.bed.intersect_c.G4s")
intron_downstream <- fread("../Figures/Figure3/Introns.hg19_downstream_100nt_window.bed.intersect_c.G4s")
colnames(intron_upstream) <- c("chrom", "start", "end", "strand", "ID", "intron_size", "transcript", "G4")
colnames(intron_downstream) <- c("chrom", "start", "end", "strand", "ID", "intron_size", "transcript", "G4")
intron_upstream[, pos:="Upstream intron"]
intron_downstream[, pos:="Downstream intron"]
intron_size <- rbind(intron_upstream, intron_downstream)
intron_size$pos <- factor(intron_size$pos, level=c("Upstream intron", "Downstream intron"))
Fig3.B <- ggplot(intron_size) +
geom_density(aes(intron_size, colour=G4>0)) +
facet_grid(. ~ pos) +
xlim(c(50,5000)) +
theme(legend.position = "top", legend.direction = "horizontal")
Fig3.B

ks.test(intron_size[G4>0, intron_size], intron_size[G4==0, intron_size])
p-value will be approximate in the presence of ties
Two-sample Kolmogorov-Smirnov test
data: intron_size[G4 > 0, intron_size] and intron_size[G4 == 0, intron_size]
D = 0.25781, p-value < 2.2e-16
alternative hypothesis: two-sided

intron_size_ints_total[ relative_frac %in% intron_size_ints_total[, max(relative_frac), by=pos]$V1, ]
int factor.x count.x total.x frac.x factor.y count.y total.y frac.y relative_frac pos
1: 70 int_counts_up_w_G4 150 61795 0.002427381 int_counts_up_wo_G4 509 651213 0.0007816183 3.105583 Upstream intron
2: 70 int_counts_down_w_G4 150 42311 0.003545177 int_counts_down_wo_G4 509 670697 0.0007589120 4.671395 Downstream intron
Upstream_U2_score_len <- fread("../Figures/Figure3/Upstream_U2_score_len_matrix.txt2.old")
Downstream_U2_score_len <- fread("../Figures/Figure3/Downstream_U2_score_len_matrix.txt2.old")
Upstream_U2_score_len <-data.table::melt(Upstream_U2_score_len, id.vars='IL')
Downstream_U2_score_len <- data.table::melt(Downstream_U2_score_len, id.vars='IL')
Upstream_U2_score_len[, pos:="Upstream intron"]
Downstream_U2_score_len[, pos:="Downstream intron"]
Fig3.D1 <- ggplot(Upstream_U2_score_len) +
geom_tile( aes(variable, as.factor(IL), fill = value*100)) +
scale_fill_gradient2(low="blue", high="red", mid = "grey", midpoint = 12.5, limits = c(0, 25)) +
facet_grid(. ~ pos) +
theme(legend.position = "bottom", legend.direction = "horizontal") + theme(axis.text.x = element_text(angle = 90)) +labs(x = NULL, y = NULL)
Fig3.D2 <- ggplot(Downstream_U2_score_len) +
geom_tile( aes(variable, as.factor(IL), fill = value*100)) +
scale_fill_gradient2(low="blue", high="red", mid = "grey", midpoint = 12.5, limits = c(0, 25)) +
facet_grid(. ~ pos) +
theme(legend.position = "bottom", legend.direction = "horizontal") +
theme(legend.position = "bottom", legend.direction = "horizontal") + theme(axis.text.x = element_text(angle = 90)) +labs(x = NULL, y = NULL)
Fig3.D <- plot_grid(Fig3.D1, Fig3.D2)
Fig3.D

closest_g4 <- function(dist.exon_up_plus_path, dist.exon_up_minus_path, dist.exon_down_plus_path, dist.exon_down_minus_path){
dist.exon_up_plus <- fread(dist.exon_up_plus_path)
colnames(dist.exon_up_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_up_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_plus[ , dist:=gmid - estart]
dist.exon_up_minus <- fread(dist.exon_up_minus_path)
colnames(dist.exon_up_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_up_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_minus[ , dist:= estart - gmid]
dist.exon_down_plus <- fread(dist.exon_down_plus_path)
colnames(dist.exon_down_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_down_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_plus[ , dist:=gmid - estart]
dist.exon_down_minus <- fread(dist.exon_down_minus_path)
colnames(dist.exon_down_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_down_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_minus[ , dist:= estart - gmid]
dist.exon_up <- rbind(dist.exon_up_plus, dist.exon_up_minus)
dist.exon_down <- rbind(dist.exon_down_plus, dist.exon_down_minus)
dist.exon_up[, pos:="3'Splice site"]
dist.exon_down[, pos:="5'Splice site"]
dist.exon <- rbind(dist.exon_up, dist.exon_down)
return(dist.exon)
}
exon.up.motif <- fread("../Figures/Figure1/exons.up.closest_G4_clean")
colnames(exon.up.motif) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend")
exon.up.motif[ , gmid:= gstart + (gend-gstart)/2]
exon.up.motif[ strand=="+" , dist:=gmid - estart]
exon.up.motif[ strand=="-" , dist:= estart - gmid]
exon.down.motif <- fread("../Figures/Figure1/exons.down.closest_G4_clean")
colnames(exon.down.motif) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend")
exon.down.motif[ , gmid:= gstart + (gend-gstart)/2]
exon.down.motif[ strand=="+" , dist:=gmid - estart]
exon.down.motif[ strand=="-" , dist:= estart - gmid]
exon.up.motif[, pos:="3'Splice site"]
exon.down.motif[, pos:="5'Splice site"]
exon.dist.motif <- rbind(exon.up.motif, exon.down.motif)
ggplot(exon.dist.motif) +
geom_density(aes(dist)) +
xlim(c(-1000, 1000)) +
facet_grid(. ~ pos)

NA
closest_g4_KCL <- closest_g4("../Figures/Figure1/exon_up_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
Error in closest_g4("../Figures/Figure1/exon_up_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed", :
could not find function "closest_g4"
#closest_g4_KCL_PDS_motif
closest_g4_KCL_PDS_motif.1kb <- closest_g4_KCL_PDS_motif[abs(dist)<=1000 , ]
closest_g4_KCL_PDS_motif.1kb[, bin:=cut(dist, seq(-1000, 1000, 5), labels= seq(-995, 1000, 5), include.lowest=TRUE ) ]
closest_g4_KCL_PDS_motif.1kb.enrichment <- closest_g4_KCL_PDS_motif.1kb[ , .(Occurrences=.N) , by=c("dist", "pos", "Type")]
closest_g4_KCL_PDS_motif.1kb.enrichment.median <- closest_g4_KCL_PDS_motif.1kb.enrichment[, .(median=median(Occurrences)), by=c( "pos", "Type") ]
closest_g4_KCL_PDS_motif.1kb.enrichment <- merge(closest_g4_KCL_PDS_motif.1kb.enrichment, closest_g4_KCL_PDS_motif.1kb.enrichment.median, by=c( "pos", "Type"))
closest_g4_KCL_PDS_motif.1kb.enrichment[, Enrrichment:=Occurrences/median]
closest_g4_KCL_PDS_motif.1kb.enrichment[Type=="Consensus G4 motif", Type:="G4 motif" ]
#closest_g4_KCL_PDS_motif.1kb.enrichment[ , bin:=as.numeric(as.character(bin))]
ggplot(closest_g4_KCL_PDS_motif.1kb.enrichment) +
geom_line(aes(dist, Enrrichment, colour=Type)) +
xlim(c(-1000, 1000)) +
facet_grid(Type ~ pos) +
xlab("Distance") +
ylab("Enrichment") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text( angle = 45))
closest_g4_2015 <- function(dist.exon_up_plus_path, dist.exon_up_minus_path, dist.exon_down_plus_path, dist.exon_down_minus_path){
dist.exon_up_plus <- fread(dist.exon_up_plus_path)
colnames(dist.exon_up_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_up_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_plus[ , dist:=gmid - estart]
dist.exon_up_minus <- fread(dist.exon_up_minus_path)
colnames(dist.exon_up_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_up_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_minus[ , dist:= estart - gmid]
dist.exon_down_plus <- fread(dist.exon_down_plus_path)
colnames(dist.exon_down_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_down_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_plus[ , dist:=gmid - estart]
dist.exon_down_minus <- fread(dist.exon_down_minus_path)
colnames(dist.exon_down_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_down_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_minus[ , dist:= estart - gmid]
dist.exon_up <- rbind(dist.exon_up_plus, dist.exon_up_minus)
dist.exon_down <- rbind(dist.exon_down_plus, dist.exon_down_minus)
dist.exon_up[, pos:="3'Splice site"]
dist.exon_down[, pos:="5'Splice site"]
dist.exon <- rbind(dist.exon_up, dist.exon_down)
return(dist.exon)
}
closest_g4_KCL_2015 <- closest_g4_2015("../Figures/Figure1/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed")
closest_g4_PDS_2015 <- closest_g4_2015("../Figures/Figure1/exon_up_plus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed")
closest_g4_KCL_2015[, Type:="G4-seq Na+ K+"]
closest_g4_PDS_2015[, Type:="G4-seq Na+ PDS"]
closest_g4_KCL_2015 <- unique(closest_g4_KCL_2015[ , c("echrom", "estart", "eend", "dist", "pos", "Type")])
closest_g4_PDS_2015 <- unique(closest_g4_PDS_2015[ , c("echrom", "estart", "eend", "dist", "pos", "Type")])
closest_g4_KCL_PDS_2015 <- rbind(closest_g4_KCL_2015, closest_g4_PDS_2015)
ggplot(closest_g4_KCL_PDS_2015) +
geom_line(aes(dist, colour=Type), bw=10, stat="density") +
xlim(c(-1000, 1000)) +
facet_grid(Type ~ pos) +
xlab("Distance") +
ylab("Density") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text( angle = 45))
closest_g4_KCL.sacCer3 <- closest_g4("../Figures/Figure1/exon_up_plus.bed.sacCer3.closest.GSM3003553_Saccaromyces_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.bed.sacCer3.closest.GSM3003553_Saccaromyces_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.bed.sacCer3.closest.GSM3003553_Saccaromyces_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.bed.sacCer3.closest.GSM3003553_Saccaromyces_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.sacCer3 <- closest_g4("../Figures/Figure1/exon_up_plus.bed.sacCer3.closest.GSM3003554_Saccaromyces_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.bed.sacCer3.closest.GSM3003554_Saccaromyces_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.bed.sacCer3.closest.GSM3003554_Saccaromyces_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.bed.sacCer3.closest.GSM3003554_Saccaromyces_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.tair10 <- closest_g4("../Figures/Figure1/exon_up_plus.bed.tair10.closest.GSM3003535_Arabidopsis_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.bed.tair10.closest.GSM3003535_Arabidopsis_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.bed.tair10.closest.GSM3003535_Arabidopsis_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.bed.tair10.closest.GSM3003535_Arabidopsis_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.tair10 <- closest_g4("../Figures/Figure1/exon_up_plus.bed.tair10.closest.GSM3003536_Arabidopsis_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.bed.tair10.closest.GSM3003536_Arabidopsis_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.bed.tair10.closest.GSM3003536_Arabidopsis_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.bed.tair10.closest.GSM3003536_Arabidopsis_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.danRer10 <- closest_g4("../Figures/Figure1/exon_up_plus.danRer10.closest.GSM3003557_Zebrafish_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.danRer10.closest.GSM3003557_Zebrafish_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.danRer10.closest.GSM3003557_Zebrafish_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.danRer10.closest.GSM3003557_Zebrafish_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.danRer10 <- closest_g4("../Figures/Figure1/exon_up_plus.danRer10.closest.GSM3003558_Zebrafish_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.danRer10.closest.GSM3003558_Zebrafish_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.danRer10.closest.GSM3003558_Zebrafish_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.danRer10.closest.GSM3003558_Zebrafish_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.dm6 <- closest_g4("../Figures/Figure1/exon_up_plus.dm6.closest.GSM3003541_Drosophila_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.dm6.closest.GSM3003541_Drosophila_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.dm6.closest.GSM3003541_Drosophila_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.dm6.closest.GSM3003541_Drosophila_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.dm6 <- closest_g4("../Figures/Figure1/exon_up_plus.dm6.closest.GSM3003542_Drosophila_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.dm6.closest.GSM3003542_Drosophila_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.dm6.closest.GSM3003542_Drosophila_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.dm6.closest.GSM3003542_Drosophila_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.mm10 <- closest_g4("../Figures/Figure1/exon_up_plus.mm10.closest.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.mm10.closest.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.mm10.closest.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.mm10.closest.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.mm10 <- closest_g4("../Figures/Figure1/exon_up_plus.mm10.closest.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.mm10.closest.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.mm10.closest.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.mm10.closest.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.hg19 <- closest_g4("../Figures/Figure1/exon_up_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.hg19 <- closest_g4("../Figures/Figure1/exon_up_plus.hg19.closest.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.hg19.closest.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.hg19.closest.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.hg19.closest.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.ce10 <- closest_g4("../Figures/Figure1/exon_up_plus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.ce10.closest.GSM3003537_Celegans_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_plus.ce10.closest.GSM3003537_Celegans_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed",
"Figures/Figure1/exon_down_minus.ce10.closest.GSM3003537_Celegans_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed")
closest_g4_PDS.ce10 <- closest_g4("../Figures/Figure1/exon_up_plus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_up_minus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_plus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed",
"Figures/Figure1/exon_down_minus.ce10.closest.GSM3003538_Celegans_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed")
closest_g4_KCL.sacCer3[, `:=`(Treatment="KCl", Species="S. cerevisiae") ]
closest_g4_PDS.sacCer3[, `:=`(Treatment="PDS", Species="S. cerevisiae") ]
closest_g4_KCL.tair10[, `:=`(Treatment="KCl", Species="A. thaliana" ) ]
closest_g4_PDS.tair10[, `:=`(Treatment="PDS", Species="A. thaliana" ) ]
closest_g4_KCL.danRer10[, `:=`(Treatment="KCl", Species="D. rerio" ) ]
closest_g4_PDS.danRer10[, `:=`(Treatment="PDS", Species="D. rerio" ) ]
closest_g4_KCL.dm6[, `:=`(Treatment="KCl", Species= "D. melanogaster" ) ]
closest_g4_PDS.dm6[, `:=`(Treatment="PDS", Species= "D. melanogaster" ) ]
closest_g4_KCL.mm10[, `:=`(Treatment="KCl", Species="M. musculus" ) ]
closest_g4_PDS.mm10[, `:=`(Treatment="PDS", Species="M. musculus" ) ]
closest_g4_KCL.hg19[, `:=`(Treatment="KCl", Species="H. sapiens" ) ]
closest_g4_PDS.hg19[, `:=`(Treatment="PDS", Species="H. sapiens" ) ]
closest_g4_KCL.ce10[, `:=`(Treatment="KCl", Species="C. elegans" ) ]
closest_g4_PDS.ce10[, `:=`(Treatment="PDS", Species="C. elegans" ) ]
closest_g4.TOTAL <- rbind(closest_g4_KCL.sacCer3,
closest_g4_PDS.sacCer3,
closest_g4_KCL.tair10,
closest_g4_PDS.tair10,
closest_g4_KCL.danRer10,
closest_g4_PDS.danRer10,
closest_g4_KCL.dm6,
closest_g4_PDS.dm6,
closest_g4_KCL.mm10,
closest_g4_PDS.mm10,
closest_g4_KCL.hg19,
closest_g4_PDS.hg19,
closest_g4_KCL.hg19,
closest_g4_PDS.hg19)
ggplot(closest_g4.TOTAL) +
geom_line(aes(dist, colour=Species), bw=10, stat="density") +
xlim(c(-1000, 1000)) +
facet_grid(Treatment ~ pos) +
xlab("Distance") +
ylab("Density") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
closest_g4.TOTAL.1kb <- closest_g4.TOTAL[abs(dist)<=1000 , ]
closest_g4.TOTAL.1kb[, bin:=cut(dist, seq(-1000, 1000, 5), labels= seq(-995, 1000, 5) ) ]
closest_g4.TOTAL.1kb.enrichment <- closest_g4.TOTAL.1kb[ , .(Occurrences=.N) , by=c("bin", "pos", "Treatment", "Species")]
closest_g4.TOTAL.1kb.enrichment.median <- closest_g4.TOTAL.1kb.enrichment[, .(median=median(Occurrences)), by=c( "pos", "Treatment", "Species") ]
closest_g4.TOTAL.1kb.enrichment <- merge(closest_g4.TOTAL.1kb.enrichment, closest_g4.TOTAL.1kb.enrichment.median, by=c( "pos", "Treatment", "Species"))
closest_g4.TOTAL.1kb.enrichment[, Enrrichment:=Occurrences/median]
closest_g4.TOTAL.1kb.enrichment[ , bin:=as.numeric(as.character(bin))]
Fig6.D <- ggplot(closest_g4.TOTAL.1kb.enrichment) +
geom_line(aes(bin, Enrrichment, colour=Species)) +
xlim(c(-1000, 1000)) +
facet_grid(Treatment ~ pos) +
xlab("Distance") +
ylab("Enrichment") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
Fig6.D
read_dist_table_plus_minus <- function(path.plus, path.minus ){
dist_table.plus <- data.table(read_delim(path.plus,
"\t", escape_double = FALSE, col_names = FALSE,
trim_ws = TRUE))
dist_table.plus <- dist_table.plus[, 2:2001]
dist_table.plus <- data.table(as.data.frame(t(dist_table.plus)))
colnames(dist_table.plus) <- c("Position", "Occurrences")
dist_table.minus <- data.table(read_delim(path.minus,
"\t", escape_double = FALSE, col_names = FALSE,
trim_ws = TRUE))
dist_table.minus <- dist_table.minus[, 2:2001]
dist_table.minus <- data.table(as.data.frame(t(dist_table.minus)))
colnames(dist_table.minus) <- c("Position", "Occurrences")
dist_table <- merge(dist_table.plus, dist_table.minus, by="Position")
dist_table[, Occurrences:=(Occurrences.x + Occurrences.y)]
dist_table[, Occurrences:=(Occurrences.x + Occurrences.y)]
dist_table <- dist_table[, c("Position", "Occurrences")]
dist_table[,median:=median(Occurrences)]
dist_table[, Enrrichment:=Occurrences/median]
dist_table[, Position:=Position-1]
return(dist_table)
}
enrichment_G4_seq_plot <- function(path.up_plus.plus, path.up_plus.minus,
path.down_plus.plus, path.down_plus.minus,
path.up_minus.plus, path.up_minus.minus,
path.down_minus.plus, path.down_minus.minus ){
x.up_plus <- read_dist_table_plus_minus(path.up_plus.plus,
path.up_plus.minus)
x.down_plus <- read_dist_table_plus_minus(path.down_plus.plus,
path.down_plus.minus)
x.up_minus <- read_dist_table_plus_minus(path.up_minus.plus,
path.up_minus.minus)
x.down_minus <- read_dist_table_plus_minus(path.down_minus.plus,
path.down_minus.minus)
x.up_minus[,Position:=Position*-1]
x.down_minus[,Position:=Position*-1]
x.TOTAL <- plot_density(x.up_plus, x.up_minus, x.down_plus, x.down_minus)
return(x.TOTAL)
}
hg19.TOTAL.KCL <- enrichment_G4_seq_plot("./G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
"./G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num")
Error in read_dist_table_plus_minus(path.up_plus.plus, path.up_plus.minus) :
could not find function "read_dist_table_plus_minus"
hg19.TOTAL.KCL[, Treatment:="KCl"]
hg19.TOTAL.PDS[, Treatment:="PDS"]
hg19.TOTAL.KCL[, Species:="H. sapiens"]
hg19.TOTAL.PDS[, Species:="H. sapiens"]
sacCer3.TOTAL.KCL[, Treatment:="KCl"]
sacCer3.TOTAL.PDS[, Treatment:="PDS"]
sacCer3.TOTAL.KCL[, Species:="S. cerevisiae"]
sacCer3.TOTAL.PDS[, Species:="S. cerevisiae"]
mouse.TOTAL.KCL[, Treatment:="KCl"]
mouse.TOTAL.PDS[, Treatment:="PDS"]
mouse.TOTAL.KCL[, Species:="M. musculus"]
mouse.TOTAL.PDS[, Species:="M. musculus"]
dm6.TOTAL.KCL[, Treatment:="KCl"]
dm6.TOTAL.PDS[, Treatment:="PDS"]
dm6.TOTAL.KCL[, Species:="D. melanogaster"]
dm6.TOTAL.PDS[, Species:="D. melanogaster"]
tair10.TOTAL.KCL[, Treatment:="KCl"]
tair10.TOTAL.PDS[, Treatment:="PDS"]
tair10.TOTAL.KCL[, Species:="A. thaliana"]
tair10.TOTAL.PDS[, Species:="A. thaliana"]
danRer10.TOTAL.KCL[, Treatment:="KCl"]
danRer10.TOTAL.PDS[, Treatment:="PDS"]
danRer10.TOTAL.KCL[, Species:="D. rerio"]
danRer10.TOTAL.PDS[, Species:="D. rerio"]
TOTAL.KCL_PDS <- rbind(hg19.TOTAL.KCL, hg19.TOTAL.PDS, sacCer3.TOTAL.KCL, sacCer3.TOTAL.PDS, mouse.TOTAL.KCL, mouse.TOTAL.PDS, dm6.TOTAL.KCL, dm6.TOTAL.PDS, tair10.TOTAL.KCL, tair10.TOTAL.PDS, danRer10.TOTAL.KCL, danRer10.TOTAL.PDS)
ggplot(TOTAL.KCL_PDS) +
geom_line(aes(Position, Enrrichment, colour=Species)) +
xlim(c(-1000, 1000)) +
facet_grid(Treatment ~ exon_pos) +
xlab("Distance") +
ylab("Enrichment") +
theme_bw() +
theme(legend.position = "top", legend.direction = "horizontal") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
closest_g4_KCL.hg19.2015 <- closest_g4("../Figures/Supplementary/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_up_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_down_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_down_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed")
closest_g4_KCL.hg19.2015 <- closest_g4("../Figures/Supplementary/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_up_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_down_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
"Figures/Supplementary/exon_down_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed")
KCL_up <- unique(closest_g4_KCL[abs(dist)>=100 & pos=="3'Splice site", paste(echrom, estart, eend, sep = "_")])
gg_color_hue <- function(n) {
hues = seq(15, 375, length = n + 1)
hcl(h = hues, l = 65, c = 100)[1:n]
}
gg_color_hue(3)
library(eulerr)
VennDiag.up <- euler(c("Motif" = 8807+9325,
"K" = 9653+10029,
"PDS" = 34880+36909,
"K&PDS" = 9890+9539,
"PDS&Motif" = 8331+8855,
"K&Motif" = 4509+4749,
"K&PDS&Motif" = 4503+4747))
Fig1.C1 <- plot(VennDiag.up, counts = TRUE, font=2, cex=1, alpha=0.5,
fill=gg_color_hue(3), quantities = list(fontsize = 10))
VennDiag.down <- euler(c("Motif" = 9507+10142,
"K" = 10120+9365,
"PDS" = 34844+36737,
"K&PDS" = 9236+9985,
"PDS&Motif" = 8973+9593,
"K&Motif" = 4806+5221,
"K&PDS&Motif" = 4802+5211))
Fig1.C2 <- plot(VennDiag.down, counts = TRUE, font=1, cex=1, alpha=0.5,
fill=gg_color_hue(3), quantities = list(fontsize = 10))
Fig1.C <- plot_grid(Fig1.C1, Fig1.C2, nrow=1)
Fig1.C
VennDiag.up_2015 <- euler(c("Motif" = 18132,
"K" = 34761,
"PDS" = 50894,
"K&PDS" = 31711,
"PDS&Motif" = 14786,
"K&Motif" = 11794,
"K&PDS&Motif" = 11250))
venn_supp.up <- plot(VennDiag.up_2015, counts = TRUE, font=2, cex=1, alpha=0.5,
fill=gg_color_hue(3), quantities = list(fontsize = 10))
VennDiag.down_2015 <- euler(c("Motif" = 19649,
"K" = 33908,
"PDS" = 49806,
"K&PDS" = 30920,
"PDS&Motif" = 15951,
"K&Motif" = 12615,
"K&PDS&Motif" = 12027))
venn_supp.down <- plot(VennDiag.down_2015, counts = TRUE, font=1, cex=1, alpha=0.5,
fill=gg_color_hue(3), quantities = list(fontsize = 10))
plot_grid(venn_supp.up, venn_supp.down, labels = c("3' Splice site", "5' Splice site"))
dataframe_G4_consensus_motif_enrichment_species <- fread("../Figures/Figure1/dataframe_G4_consensus_motif_enrichment_species")
dataframe_G4_consensus_motif_enrichment_species_matrix <- t(dataframe_G4_consensus_motif_enrichment_species)
header <- as.character(head(dataframe_G4_consensus_motif_enrichment_species_matrix, 1))
dataframe_G4_consensus_motif_enrichment_species_df <- as.data.frame(tail(dataframe_G4_consensus_motif_enrichment_species_matrix, -1))
colnames(dataframe_G4_consensus_motif_enrichment_species_df) <- header
dataframe_G4_consensus_motif_enrichment_species_df$specie <- rownames(dataframe_G4_consensus_motif_enrichment_species_df)
dataframe_G4_consensus_motif_enrichment_species_dt <- data.table(dataframe_G4_consensus_motif_enrichment_species_df)
dataframe_G4_consensus_motif_enrichment_species_dt$median <- as.numeric(as.character(dataframe_G4_consensus_motif_enrichment_species_dt$median))
dataframe_G4_consensus_motif_enrichment_species_dt$st.dev <- as.numeric(as.character(dataframe_G4_consensus_motif_enrichment_species_dt$st.dev))
dataframe_G4_consensus_motif_enrichment_species_dt$specie <- factor(dataframe_G4_consensus_motif_enrichment_species_dt$specie , levels=dataframe_G4_consensus_motif_enrichment_species_dt[order(-median)]$specie)
Fig6.A <- ggplot(dataframe_G4_consensus_motif_enrichment_species_dt, aes(x = specie, y=median) ) +
geom_bar( stat="identity", colour="black", fill="white") +
geom_errorbar(aes(ymin = (median - st.dev), ymax = (as.numeric(median) + as.numeric(st.dev))), colour="red" , width=0.2) +
theme_bw()+
xlab("Species") +
ylab("Density (G4s / kB)") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
Fig6.A
dataframe_evo_PDS_K <- fread("../Figures/Figure1/dataframe_evo_PDS_K")
dataframe_evo_PDS_K_matrix <- t(dataframe_evo_PDS_K)
header <- as.character(head(dataframe_evo_PDS_K_matrix, 1))
dataframe_evo_PDS_K_df <- as.data.frame(tail(dataframe_evo_PDS_K_matrix, -1))
colnames(dataframe_evo_PDS_K_df) <- header
dataframe_evo_PDS_K_df$Species <- rownames(dataframe_evo_PDS_K_df)
dataframe_evo_PDS_K_dt <- data.table(dataframe_evo_PDS_K_df)
dataframe_evo_PDS_K_dt_nice <- rbind(dataframe_evo_PDS_K_dt[ , .(Species=Species, Treatment="K+", median=K_median, st.dev=K_st.dev ) ],
dataframe_evo_PDS_K_dt[ , .(Species=Species, Treatment="PDS", median=PDS_median, st.dev=PDS_st.dev ) ])
dataframe_evo_PDS_K_dt_nice$median <- as.numeric(as.character(dataframe_evo_PDS_K_dt_nice$median))
dataframe_evo_PDS_K_dt_nice$st.dev <- as.numeric(as.character(dataframe_evo_PDS_K_dt_nice$st.dev))
ggplot(dataframe_evo_PDS_K_dt_nice, aes(x = Species, y=median, group=Treatment)) +
geom_bar( aes(colour=Treatment ), stat="identity", fill="white", position="dodge") +
geom_errorbar(aes(ymin = (median - st.dev), ymax = (as.numeric(median) + as.numeric(st.dev))), colour="black" , width=0.2, position = position_dodge()) +
theme_bw()+
xlab("Species") +
ylab("Density (G4s / kB)") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
dataframe_evo_PDS_K_dt_nice$Species <- factor(dataframe_evo_PDS_K_dt_nice$Species , levels=dataframe_evo_PDS_K_dt_nice[Treatment=="PDS"][order(-median)]$Species)
Fig6.C <- ggplot(dataframe_evo_PDS_K_dt_nice, aes(x=Species, weight=median, ymin=median-st.dev, ymax=median+st.dev, group=Treatment)) +
geom_bar(position=position_dodge(), aes(y=median, color=Treatment), fill="white", stat="identity") +
geom_errorbar (position=position_dodge(width=0.9), colour="black", width=0.2) +
theme_bw()+
xlab("Species") +
ylab("Density (G4s / kB)") +
theme(axis.text.x = element_text(vjust = 0.7,
angle = 45))
Fig6.C
dataframe_evo_PDS_K_dt_nice
Figures
Fig1.BC <- plot_grid(Fig1.B, Fig1.C, ncol=1, labels = c("B", "C"), rel_heights = c(2, 1))
Error in plot_grid(Fig1.B, Fig1.C, ncol = 1, labels = c("B", "C"), rel_heights = c(2, :
object 'Fig1.B' not found
Fig2 <- plot_grid(Fig2.A, Fig2.B,ncol = 1 , labels ="AUTO", rel_heights = c(1.5, 1))
Fig2
Fig3 <-plot_grid(Fig3.top, Fig3.D.new, labels = c("", "E"), ncol = 1, rel_heights = c(1.5, 1) )
Removed 2796 rows containing missing values (geom_path).
Fig5.bottom <- plot_grid(Fig5.A, Fig5.B, Fig5.C, Fig5.D, nrow = 2, ncol = 2 , labels = c("B", "C", "D", "E"), rel_heights = c(1, 1, 1, 1))
Removed 2996 rows containing missing values (geom_path).Removed 2996 rows containing missing values (geom_path).
Fig5 <- plot_grid(Fig5.A1, Fig5.bottom, nrow=2, labels = c("A", ""), rel_heights = c(2, 4))
Fig5

Fig6.top <- plot_grid(Fig6.A, Fig6.C, labels = c("A", "C"))
Fig6.bottom <- plot_grid(Fig6.B, Fig6.D, labels = c("B", "D"))
Fig6 <- plot_grid(Fig6.A, Fig6.C, Fig6.B , Fig6.D, labels = c("A", "C", "B", "D") , ncol=2, rel_heights = c(1, 1, 3, 3))
Fig6 <- plot_grid(Fig6.top, Fig6.bottom, rel_heights = c(1, 1.5), nrow=2)
Fig6
LS0tCnRpdGxlOiAiR2Vvcmdha29wb3Vsb3VzLXNvYXJlcyBhbmQgUGFyYWRhIGV0LiBhbCAyMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgoKCgojIE5vbi1CIEROQSBzdHJ1Y3R1cmVzIGFjcm9zcyBzcGxpY2Utc2l0ZXMKCgpUbyBpbnZlc3RpZ2F0ZSBpZiBub24tQiBETkEgc3RydWN0dXJlcyBjYW4gYWZmZWN0IHNwbGljaW5nLCB3ZSBleHBsb3JlIHRoZSBkaXN0cmlidXRpb24gb2YgZGlmZmVyZW50IG1vdGlmcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggTm9uLUIgRE5BIHN0cnVjdHVyZXMuIFdlIGNhbGN1bGF0ZWQgdGhlIG51bWJlciBvZiB0aGVzZSBtb3RpZnMgdGhhdCBjYW4gYmUgZm91bmQgYWNyb3NzIHNwbGljZSBzaXRlcyAoLm51bSBmaWxlcykgYW5kIHRoZW4gd2UgY2FsY3VsYXRlZCB0aGUgcG9zaXRpb25hbCBlbnJpY2htZW50IG9mIHRoZXNlIGFjcm9zcyBzcGxpY2Ugc2l0ZXMuIAoKCgpgYGB7cn0KbGlicmFyeShyZWFkcikKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGx5cikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KEhtaXNjKQoKCmBgYAoKCk9uIHRoaXMgcmVwb3J0IHdlIGNvbXBpbGUgYWxsIHRoZSBkYXRhIGFuYWx5c2lzIHRoYXQgbGVhZCB1cyB0byBnZXQgdGhlIGZpbmFsIGZpZ3VyZXMuIEZvciB0aGlzLCB3ZSBwcm9jZXNzZWQgc2V2ZXJhbCAgYQoKYGBge3J9CgoKCnJlYWRfZGlzdF90YWJsZSA8LSBmdW5jdGlvbihwYXRoKXsKICAKZGlzdF90YWJsZSA8LSBkYXRhLnRhYmxlKHJlYWRfZGVsaW0ocGF0aCwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IEZBTFNFLCAKICAgIHRyaW1fd3MgPSBUUlVFKSkKCmRpc3RfdGFibGUgPC0gZGlzdF90YWJsZVssIDI6MjAwMV0KZGlzdF90YWJsZSA8LSBkYXRhLnRhYmxlKGFzLmRhdGEuZnJhbWUodChkaXN0X3RhYmxlKSkpCmNvbG5hbWVzKGRpc3RfdGFibGUpIDwtIGMoIlBvc2l0aW9uIiwgIk9jY3VycmVuY2VzIikKCmRpc3RfdGFibGVbLG1lZGlhbjo9bWVkaWFuKE9jY3VycmVuY2VzKV0KZGlzdF90YWJsZVssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCmRpc3RfdGFibGVbLCBQb3NpdGlvbjo9UG9zaXRpb24tMV0KCnJldHVybihkaXN0X3RhYmxlKSAgCn0KCgpgYGAKCgoKCmBgYHtyfQoKcGxvdF9kZW5zaXR5IDwtIGZ1bmN0aW9uKHVwX3BsdXMsIHVwX21pbnVzLCBkb3duX3BsdXMsIGRvd25fbWludXMpewoKICAKICB1cF9UT1RBTCA8LSAgbWVyZ2UodXBfcGx1cywgdXBfbWludXMsIGJ5PSJQb3NpdGlvbiIpCiAgdXBfVE9UQUxbLE9jY3VycmVuY2VzOj1PY2N1cnJlbmNlcy54K09jY3VycmVuY2VzLnldCiAgdXBfVE9UQUxbLG1lZGlhbjo9bWVkaWFuKE9jY3VycmVuY2VzKV0KICB1cF9UT1RBTFssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCiAgdXBfVE9UQUxbLCBQb3NpdGlvbjo9UG9zaXRpb24tMV0KICAKICAKICBkb3duX1RPVEFMIDwtICBtZXJnZShkb3duX3BsdXMsIGRvd25fbWludXMsIGJ5PSJQb3NpdGlvbiIpCiAgZG93bl9UT1RBTFssT2NjdXJyZW5jZXM6PU9jY3VycmVuY2VzLngrT2NjdXJyZW5jZXMueV0KICBkb3duX1RPVEFMWyxtZWRpYW46PW1lZGlhbihPY2N1cnJlbmNlcyldCiAgZG93bl9UT1RBTFssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCiAgZG93bl9UT1RBTFssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXQogIAogIHVwX1RPVEFMWyAsZXhvbl9wb3M6PSJVcHN0cmVhbSJdCiAgZG93bl9UT1RBTFsgLGV4b25fcG9zOj0iRG93bnN0cmVhbSJdCiAgCiAgVE9UQUwgPC0gcmJpbmQodXBfVE9UQUwsIGRvd25fVE9UQUwpCiAgCiAgVE9UQUwkZXhvbl9wb3MgPC0gIGZhY3RvcihUT1RBTCRleG9uX3BvcywgbGV2ZWxzPWMoIlVwc3RyZWFtIiwgIkRvd25zdHJlYW0iICkpIAogIAogIHAgPC0gZ2dwbG90KFRPVEFMKSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgdGhlbWVfYncoKQogIAogICNzaG93KHApCiAgCiAgVE9UQUwKICAKICAKCn0KYGBgCgoKCmBgYHtyfQoKCnBsb3RfZGVuc2l0eV9iaW5vbWlhbCA8LSBmdW5jdGlvbih1cF9wbHVzLCB1cF9taW51cywgZG93bl9wbHVzLCBkb3duX21pbnVzLCBvYnNlcnZhdGlvbnMsIHNpZyl7CgogIAogIHVwX1RPVEFMIDwtICBtZXJnZSh1cF9wbHVzLCB1cF9taW51cywgYnk9IlBvc2l0aW9uIikKICB1cF9UT1RBTFssT2NjdXJyZW5jZXM6PU9jY3VycmVuY2VzLngrT2NjdXJyZW5jZXMueV0KICB1cF9UT1RBTFssT2NjdXJyZW5jZXM6PU9jY3VycmVuY2VzLngrT2NjdXJyZW5jZXMueV0KICAKCiAgCiAgCiAgdXBfVE9UQUwgPC0gY2JpbmQodXBfVE9UQUwsIHVwX1RPVEFMWywgYmluY29uZihPY2N1cnJlbmNlcywgb2JzZXJ2YXRpb25zLCBhbHBoYT1zaWcpIF0pCgogIHVwX1RPVEFMWyxtZWRpYW46PW1lZGlhbihQb2ludEVzdCldCiAgdXBfVE9UQUxbLCBFbnJyaWNobWVudDo9UG9pbnRFc3QvbWVkaWFuXQogIHVwX1RPVEFMWywgRW5ycmljaG1lbnRfbDo9TG93ZXIvbWVkaWFuXQogIHVwX1RPVEFMWywgRW5ycmljaG1lbnRfdTo9VXBwZXIvbWVkaWFuXQogIHVwX1RPVEFMWywgUG9zaXRpb246PVBvc2l0aW9uLTFdCgogIAogIAogIGRvd25fVE9UQUwgPC0gIG1lcmdlKGRvd25fcGx1cywgZG93bl9taW51cywgYnk9IlBvc2l0aW9uIikKICBkb3duX1RPVEFMWyxPY2N1cnJlbmNlczo9T2NjdXJyZW5jZXMueCtPY2N1cnJlbmNlcy55XQoKICAKICBkb3duX1RPVEFMIDwtIGNiaW5kKGRvd25fVE9UQUwsIGRvd25fVE9UQUxbLCBiaW5jb25mKE9jY3VycmVuY2VzLCBvYnNlcnZhdGlvbnMsIGFscGhhPXNpZykgXSkKCiAgZG93bl9UT1RBTFssbWVkaWFuOj1tZWRpYW4oUG9pbnRFc3QpXQogIGRvd25fVE9UQUxbLCBFbnJyaWNobWVudDo9UG9pbnRFc3QvbWVkaWFuXQogIGRvd25fVE9UQUxbLCBFbnJyaWNobWVudF9sOj1Mb3dlci9tZWRpYW5dCiAgZG93bl9UT1RBTFssIEVucnJpY2htZW50X3U6PVVwcGVyL21lZGlhbl0KICBkb3duX1RPVEFMWywgUG9zaXRpb246PVBvc2l0aW9uLTFdICAKICAKICAKICB1cF9UT1RBTFsgLGV4b25fcG9zOj0iVXBzdHJlYW0iXQogIGRvd25fVE9UQUxbICxleG9uX3Bvczo9IkRvd25zdHJlYW0iXQogIAogIFRPVEFMIDwtIHJiaW5kKHVwX1RPVEFMLCBkb3duX1RPVEFMKQogIAogIFRPVEFMJGV4b25fcG9zIDwtICBmYWN0b3IoVE9UQUwkZXhvbl9wb3MsIGxldmVscz1jKCJVcHN0cmVhbSIsICJEb3duc3RyZWFtIiApKSAKICAKICBwIDwtIGdncGxvdChUT1RBTCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIGdlb21fcmliYm9uKGFlcyh5bWluPUVucnJpY2htZW50X2wsIHltYXg9RW5ycmljaG1lbnRfdSwgeD1Qb3NpdGlvbiksIGFscGhhPTAuMyApKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgdGhlbWVfYncoKQogIAogICNzaG93KHApCiAgCiAgcmV0dXJuKFRPVEFMKSAKICAKfQpgYGAKCgoKIyMgRy1RdWFkcnVwbGV4ZXMKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCkc0LnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvRzQuZXhvbi51cF9wbHVzLmxpc3Qub3V0Lm51bSIpCkc0LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9HNC5leG9uLmRvd25fcGx1cy5saXN0Lm91dC5udW0iKQpHNC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9HNC5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpCkc0LmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvRzQuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCkc0LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCkc0LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCkc0LlRPVEFMIDwtIHBsb3RfZGVuc2l0eShHNC51cF9wbHVzLCBHNC51cF9taW51cywgRzQuZG93bl9wbHVzLCBHNC5kb3duX21pbnVzKSAKCmBgYAoKCiMjIERpcmVjdGVkIHJlcGVhdHMKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpEUi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL0RSLmV4b24udXBfcGx1cy5saXN0Lm91dC5udW0iKQpEUi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvRFIuZXhvbi5kb3duX3BsdXMubGlzdC5vdXQubnVtIikKRFIudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvRFIuZXhvbi51cF9taW51cy5saXN0Lm91dC5udW0iKQpEUi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL0RSLmV4b24uZG93bl9taW51cy5saXN0Lm91dC5udW0iKQpEUi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpEUi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgoKRFIuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KERSLnVwX3BsdXMsIERSLnVwX21pbnVzLCBEUi5kb3duX3BsdXMsIERSLmRvd25fbWludXMpCgpgYGAKCgojIyBILUROQQoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCkhfRE5BLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvSF9ETkEuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCkhfRE5BLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9IX0ROQS5leG9uLmRvd25fcGx1cy5saXN0Lm91dC5udW0iKQpIX0ROQS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9IX0ROQS5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpCkhfRE5BLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvSF9ETkEuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCkhfRE5BLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCkhfRE5BLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpIX0ROQS5UT1RBTCA8LSBwbG90X2RlbnNpdHkoSF9ETkEudXBfcGx1cywgSF9ETkEudXBfbWludXMsIEhfRE5BLmRvd25fcGx1cywgSF9ETkEuZG93bl9taW51cykKCmBgYAoKCiMjIEludmVydGVkIHJlcGVhdAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCklSLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvSVIuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCklSLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9JUi5leG9uLmRvd25fcGx1cy5saXN0Lm91dC5udW0iKQpJUi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9JUi5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpCklSLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvSVIuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCklSLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCklSLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpJUi5UT1RBTCA8LSBwbG90X2RlbnNpdHkoSVIudXBfcGx1cywgSVIudXBfbWludXMsIElSLmRvd25fcGx1cywgSVIuZG93bl9taW51cykKCmBgYAoKCiMjIE1pcnJvciByZXBlYXQKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCk1SLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvTVIuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCk1SLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9NUi5leG9uLmRvd25fcGx1cy5saXN0Lm91dC5udW0iKQpNUi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9NUi5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpCk1SLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvTVIuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCk1SLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCk1SLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpNUi5UT1RBTCA8LSBwbG90X2RlbnNpdHkoTVIudXBfcGx1cywgTVIudXBfbWludXMsIE1SLmRvd25fcGx1cywgTVIuZG93bl9taW51cykKCmBgYAoKCiMjIFNob3J0IHRhbmRlbSByZXBlYXQKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KClNUUi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL1NUUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKU1RSLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9TVFIuZXhvbi5kb3duX3BsdXMubGlzdC5vdXQubnVtIikKU1RSLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL1NUUi5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpClNUUi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL1NUUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKU1RSLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdClNUUi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgoKU1RSLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShTVFIudXBfcGx1cywgU1RSLnVwX21pbnVzLCBTVFIuZG93bl9wbHVzLCBTVFIuZG93bl9taW51cykKCmBgYAoKCgojIyBaLUROQQoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KClpfRE5BLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvWl9ETkEuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpClpfRE5BLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9aX0ROQS5leG9uLmRvd25fcGx1cy5saXN0Lm91dC5udW0iKQpaX0ROQS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9aX0ROQS5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpClpfRE5BLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvWl9ETkEuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpClpfRE5BLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdClpfRE5BLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpaX0ROQS5UT1RBTCA8LSBwbG90X2RlbnNpdHkoWl9ETkEudXBfcGx1cywgWl9ETkEudXBfbWludXMsIFpfRE5BLmRvd25fcGx1cywgWl9ETkEuZG93bl9taW51cykKCmBgYAoKCiMjIEFsbCBOb24tQiBETkEgbW90aWZzIAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD01fQpHNC5UT1RBTFssIE5vbl9COj0iRzQiXQpEUi5UT1RBTFssIE5vbl9COj0iRFIiXQpIX0ROQS5UT1RBTFssIE5vbl9COj0iSCBETkEiXQpJUi5UT1RBTFssIE5vbl9COj0iSVIiXQpNUi5UT1RBTFssIE5vbl9COj0iTVIiXQpTVFIuVE9UQUxbLCBOb25fQjo9IlNUUiJdClpfRE5BLlRPVEFMWywgTm9uX0I6PSJaIEROQSJdCgpOb25fQi5UT1RBTCA8LSByYmluZChHNC5UT1RBTCwgRFIuVE9UQUwsIEhfRE5BLlRPVEFMLCBJUi5UT1RBTCwgTVIuVE9UQUwsIFNUUi5UT1RBTCwgWl9ETkEuVE9UQUwpCgpGaWcxLkEgPC0gZ2dwbG90KE5vbl9CLlRPVEFMKSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgeGxpbShjKC0zMDAsMzAwKSkgKwogICAgZmFjZXRfZ3JpZCggTm9uX0IgfiBleG9uX3BvcyApICsKICB0aGVtZV9idygpCgpGaWcxLkEKCmBgYAoKCgoKYGBge3J9CgpOb25fQi5UT1RBTC5FbnJyaWNobWVudF9QZWFrIDwtIE5vbl9CLlRPVEFMWyAsIC4oRW5ycmljaG1lbnRfUGVhaz1tYXgoRW5ycmljaG1lbnQpKSAsIGJ5ID0gYygiTm9uX0IiLCAiZXhvbl9wb3MiICldCgoKCndyaXRlLnRhYmxlKE5vbl9CLlRPVEFMLkVucnJpY2htZW50X1BlYWssIGZpbGUgPSAiLi9UYWJsZXMvTm9uX0IuVE9UQUwuRW5ycmljaG1lbnRfUGVhay50eHQiLCBhcHBlbmQgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIlx0IiwKICAgICAgICAgICAgZW9sID0gIlxuIiwgbmEgPSAiTkEiLCBkZWMgPSAiLiIsIHJvdy5uYW1lcyA9IEZBTFNFLAogICAgICAgICAgICBjb2wubmFtZXMgPSBUUlVFLCBxbWV0aG9kID0gYygiZXNjYXBlIiwgImRvdWJsZSIpLAogICAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiIikKCmBgYAoKCiMgRGlzdHJpYnV0aW9uIG9mIG5vbi1CIEROQSBtb3RpZnMgYWNyb3NzIHdlYWsgYW5kIHN0cm9uZyBzcGxpY2Ugc2l0ZXMKCgpXZSBjYWxjdWxhdGVkIHRoZSBkaXN0cmlidXRpb24gb2Ygbm9uLUIgRE5BIG1vdGlmcyBhY3Jvc3MgcXVhcnRpbGVzIG9mIHNwbGljZSBzdHJlbmd0aCwgd2hlcmUgUTEgYXJlIHRoZSB3ZWFrZXN0IHNwbGljZSBzaXRlcyBhbmQgUTQgYXJlIHRoZSBzdHJvbmdlc3QuICAKCgpgYGB7cn0KCk1lcmdlX1FzIDwtIGZ1bmN0aW9uKFFzLmxpc3QsIHdpbmRvd19sZW4sIHN0cmFuZCApIHsKICAKICBUb3RhbF9RcyA8LSBkYXRhLnRhYmxlKHJiaW5kbGlzdChRcy5saXN0KSkKICBRX25hbWVzIDwtIHNlcShucm93KFRvdGFsX1FzKS93aW5kb3dfbGVuKQogIFRvdGFsX1FzWywgUTo9cmVwKFFfbmFtZXMsIGVhY2g9d2luZG93X2xlbildCiAgCiAgaWYoc3RyYW5kPT0iLSIpewogICAgCiAgICBUb3RhbF9Rc1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQogIH0KICAKICBUb3RhbF9Rcwp9CgoKYGBgCgoKYGBge3J9Cm1lcmdlX3BsdXNfbWludXMgPC0gZnVuY3Rpb24ocGx1cywgbWludXMpewoKICBUT1RBTCA8LSBtZXJnZShwbHVzLCBtaW51cywgYnk9YygiUG9zaXRpb24iLCAiUSIpICkKICBUT1RBTFssT2NjdXJyZW5jZXM6PU9jY3VycmVuY2VzLngrT2NjdXJyZW5jZXMueV0KICBUT1RBTFssbWVkaWFuOj1tZWRpYW4oT2NjdXJyZW5jZXMpLCAgYnk9YygiUSIpXQogIFRPVEFMWywgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbl0KICBUT1RBTFssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXQogIAp9CmBgYAoKCmBgYHtyfQpNZXJnZV91cF9kb3duIDwtIGZ1bmN0aW9uKFFzLnVwLCBRcy5kb3duKXsKCiAgUXMudG90YWwgPC0gcmJpbmQoUXMudXAsIFFzLmRvd24pCiAgCiAgaGFsZl9uIDwtIG5yb3coUXMudG90YWwpLzIKICBRcy50b3RhbFssIGV4b25fcG9zOj1yZXAoYygiVXBzdHJlYW0iLCAiRG93bnN0cmVhbSIpLCBlYWNoPWhhbGZfbikgXQogIAogIAogIFFzLnRvdGFsJGV4b25fcG9zIDwtICBmYWN0b3IoUXMudG90YWwkZXhvbl9wb3MsIGxldmVscz1jKCJVcHN0cmVhbSIsICJEb3duc3RyZWFtIiApKQogIFFzLnRvdGFsJFEgPC0gIGZhY3RvcihRcy50b3RhbCRRKQogIAogIFFzLnRvdGFsCiAgCn0KYGBgCgoKCmBgYHtyfQoKCmdldF90b3RhbF9RcyA8LSBmdW5jdGlvbihRcy5wbHVzLnVwLmxpc3QsIFFzLm1pbnVzLmxpc3QsIFFzLnBsdXMuZG93bi5saXN0LCBRcy5taW51cy5kb3duLmxpc3QsIHdpbmRvd19sZW4pewoKICBRcy5wbHVzLnVwIDwtIE1lcmdlX1FzKFFzLnBsdXMudXAubGlzdCwgd2luZG93X2xlbiwgc3RyYW5kPSIrIikKICBRcy5taW51cy51cCA8LSBNZXJnZV9RcyhRcy5taW51cy5saXN0LCB3aW5kb3dfbGVuLCBzdHJhbmQ9Ii0iKQogIFFzLnVwIDwtIG1lcmdlX3BsdXNfbWludXMoUXMucGx1cy51cCwgUXMubWludXMudXApCiAgCiAgUXMucGx1cy5kb3duIDwtIE1lcmdlX1FzKFFzLnBsdXMuZG93bi5saXN0LCB3aW5kb3dfbGVuLCBzdHJhbmQ9IisiKQogIFFzLm1pbnVzLmRvd248LSBNZXJnZV9RcyhRcy5taW51cy5kb3duLmxpc3QsIHdpbmRvd19sZW4sIHN0cmFuZD0iLSIpCiAgUXMuZG93biA8LSBtZXJnZV9wbHVzX21pbnVzKFFzLnBsdXMuZG93biwgUXMubWludXMuZG93bikKICAKICBRcy50b3RhbCA8LSBNZXJnZV91cF9kb3duKFFzLnVwLCBRcy5kb3duKQogIAogIFFzLnRvdGFsCiAgCn0KICAKYGBgCgoKCmBgYHtyfQoKCkc0LlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnExLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMi5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTMuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnE0LmJlZC5HNC5saXN0Lm91dC5udW0iKQoKRzQuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnExLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTIuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMy5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnE0LmJlZC5HNC5saXN0Lm91dC5udW0iKQoKRzQuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMS5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMi5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMy5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xNC5iZWQuRzQubGlzdC5vdXQubnVtIikKCkc0LlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnExLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMi5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTMuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuLy9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuRzQubGlzdC5vdXQubnVtIikKCkc0LlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0LlExX3VwX3BsdXMsIEc0LlEyX3VwX3BsdXMsIEc0LlEzX3VwX3BsdXMsIEc0LlE0X3VwX3BsdXMpCkc0LlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNC5RMV91cF9taW51cywgRzQuUTJfdXBfbWludXMsIEc0LlEzX3VwX21pbnVzLCBHNC5RNF91cF9taW51cykKRzQuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNC5RMV9kb3duX3BsdXMsIEc0LlEyX2Rvd25fcGx1cywgRzQuUTNfZG93bl9wbHVzLCBHNC5RNF9kb3duX3BsdXMpCkc0LlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0LlExX2Rvd25fbWludXMsIEc0LlEyX2Rvd25fbWludXMsIEc0LlEzX2Rvd25fbWludXMsIEc0LlE0X2Rvd25fbWludXMpCkc0LndpbmRvd19sZW4gPSAyMDAwCgpHNC5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzQuUXMucGx1cy51cC5saXN0LCBHNC5Rcy5taW51cy5saXN0LCBHNC5Rcy5wbHVzLmRvd24ubGlzdCwgRzQuUXMubWludXMuZG93bi5saXN0LCBHNC53aW5kb3dfbGVuKQoKRzQuUXMudG90YWwkUSA8LSBtYXB2YWx1ZXMoRzQuUXMudG90YWwkUSwgIGZyb20gPWMoMTo0KSwgdG8gPWMoIlExIiwgIlEyIiwgIlEzIiwgIlE0IikpCgpnZ3Bsb3QoRzQuUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpICsKICB0aGVtZV9idygpK2xhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKV2UgY2FsY3VsYXRlZCB0aGUgYmlub21pYWwgY29uZmlkZW5jZSBpbnRlcnZhbHMgZ2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZiBleG9uIGluIGVhY2ggcXVhcnRpbGUKCgpgYGB7cn0KCmhnMTkubmV4b25zIDwtIDEyMzQzMyArIDEyMzkzNiAgI051bWJlciBvZiBleG9ucyBmb3VuZCBpbiBlYWNoIHNpZGUKCkc0LlFzLnRvdGFsLmJpbm9taWFsIDwtIGNiaW5kKEc0LlFzLnRvdGFsLCAgRzQuUXMudG90YWxbLCBiaW5jb25mKE9jY3VycmVuY2VzLCBoZzE5Lm5leG9ucy80KSBdKQpHNC5Rcy50b3RhbC5iaW5vbWlhbFsgLCBtZWRpYW46PW1lZGlhbihQb2ludEVzdCksIGJ5PWMoImV4b25fcG9zIiwgIlEiKV0KRzQuUXMudG90YWwuYmlub21pYWxbLCBgOj1gKEVucnJpY2htZW50PVBvaW50RXN0L21lZGlhbiwgRW5ycmljaG1lbnRfbD1Mb3dlci9tZWRpYW4sIEVucnJpY2htZW50X3U9VXBwZXIvbWVkaWFuKV0KCgpnZ3Bsb3QoRzQuUXMudG90YWwuYmlub21pYWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICBnZW9tX3JpYmJvbihhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBmaWxsPVEsIHltaW49RW5ycmljaG1lbnRfbCwgeW1heD1FbnJyaWNobWVudF91KSwgYWxwaGE9MC4zKSArCiAgeGxpbShjKC0xNTAsMTUwKSkgKwogIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSArCiAgdGhlbWVfYncoKStsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgpgYGAKCgpUaGVuIHdlIGV4cGxvcmVkIHRoZSBlbnJpY2htZW50IGluIG90aGVyIG5vbi1CIEROQSBtb3RpZnMKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKRFIuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTEuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMi5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTQuYmVkLkRScy5saXN0Lm91dC5udW0iKQoKRFIuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnExLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEzLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnE0LmJlZC5EUnMubGlzdC5vdXQubnVtIikKCkRSLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEyLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMy5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLkRScy5saXN0Lm91dC5udW0iKQoKRFIuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTEuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMi5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTQuYmVkLkRScy5saXN0Lm91dC5udW0iKQoKRFIuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRFIuUTFfdXBfcGx1cywgRFIuUTJfdXBfcGx1cywgRFIuUTNfdXBfcGx1cywgRFIuUTRfdXBfcGx1cykKRFIuUXMubWludXMubGlzdCA8LSBsaXN0KERSLlExX3VwX21pbnVzLCBEUi5RMl91cF9taW51cywgRFIuUTNfdXBfbWludXMsIERSLlE0X3VwX21pbnVzKQpEUi5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KERSLlExX2Rvd25fcGx1cywgRFIuUTJfZG93bl9wbHVzLCBEUi5RM19kb3duX3BsdXMsIERSLlE0X2Rvd25fcGx1cykKRFIuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRFIuUTFfZG93bl9taW51cywgRFIuUTJfZG93bl9taW51cywgRFIuUTNfZG93bl9taW51cywgRFIuUTRfZG93bl9taW51cykKRFIud2luZG93X2xlbiA9IDIwMDAKCkRSLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhEUi5Rcy5wbHVzLnVwLmxpc3QsIERSLlFzLm1pbnVzLmxpc3QsIERSLlFzLnBsdXMuZG93bi5saXN0LCBEUi5Rcy5taW51cy5kb3duLmxpc3QsIERSLndpbmRvd19sZW4pCgoKICAKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpIX0ROQS5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTIuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKCkhfRE5BLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMS5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xNC5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKCkhfRE5BLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTMuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCgpIX0ROQS5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTIuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKCkhfRE5BLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEhfRE5BLlExX3VwX3BsdXMsIEhfRE5BLlEyX3VwX3BsdXMsIEhfRE5BLlEzX3VwX3BsdXMsIEhfRE5BLlE0X3VwX3BsdXMpCkhfRE5BLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChIX0ROQS5RMV91cF9taW51cywgSF9ETkEuUTJfdXBfbWludXMsIEhfRE5BLlEzX3VwX21pbnVzLCBIX0ROQS5RNF91cF9taW51cykKSF9ETkEuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChIX0ROQS5RMV9kb3duX3BsdXMsIEhfRE5BLlEyX2Rvd25fcGx1cywgSF9ETkEuUTNfZG93bl9wbHVzLCBIX0ROQS5RNF9kb3duX3BsdXMpCkhfRE5BLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEhfRE5BLlExX2Rvd25fbWludXMsIEhfRE5BLlEyX2Rvd25fbWludXMsIEhfRE5BLlEzX2Rvd25fbWludXMsIEhfRE5BLlE0X2Rvd25fbWludXMpCkhfRE5BLndpbmRvd19sZW4gPSAyMDAwCgpIX0ROQS5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoSF9ETkEuUXMucGx1cy51cC5saXN0LCBIX0ROQS5Rcy5taW51cy5saXN0LCBIX0ROQS5Rcy5wbHVzLmRvd24ubGlzdCwgSF9ETkEuUXMubWludXMuZG93bi5saXN0LCBIX0ROQS53aW5kb3dfbGVuKQoKCmBgYAoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKSVIuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTEuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMi5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTQuYmVkLklScy5saXN0Lm91dC5udW0iKQoKSVIuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnExLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEzLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnE0LmJlZC5JUnMubGlzdC5vdXQubnVtIikKCklSLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEyLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMy5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLklScy5saXN0Lm91dC5udW0iKQoKSVIuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTEuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMi5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTQuYmVkLklScy5saXN0Lm91dC5udW0iKQoKSVIuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoSVIuUTFfdXBfcGx1cywgSVIuUTJfdXBfcGx1cywgSVIuUTNfdXBfcGx1cywgSVIuUTRfdXBfcGx1cykKSVIuUXMubWludXMubGlzdCA8LSBsaXN0KElSLlExX3VwX21pbnVzLCBJUi5RMl91cF9taW51cywgSVIuUTNfdXBfbWludXMsIElSLlE0X3VwX21pbnVzKQpJUi5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KElSLlExX2Rvd25fcGx1cywgSVIuUTJfZG93bl9wbHVzLCBJUi5RM19kb3duX3BsdXMsIElSLlE0X2Rvd25fcGx1cykKSVIuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoSVIuUTFfZG93bl9taW51cywgSVIuUTJfZG93bl9taW51cywgSVIuUTNfZG93bl9taW51cywgSVIuUTRfZG93bl9taW51cykKSVIud2luZG93X2xlbiA9IDIwMDAKCklSLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhJUi5Rcy5wbHVzLnVwLmxpc3QsIElSLlFzLm1pbnVzLmxpc3QsIElSLlFzLnBsdXMuZG93bi5saXN0LCBJUi5Rcy5taW51cy5kb3duLmxpc3QsIElSLndpbmRvd19sZW4pCgoKYGBgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpNUi5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEyLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTMuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCgpNUi5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTEuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTIuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTQuYmVkLk1Scy5saXN0Lm91dC5udW0iKQoKTVIuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMS5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEzLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xNC5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCgpNUi5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTMuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCgpNUi5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChNUi5RMV91cF9wbHVzLCBNUi5RMl91cF9wbHVzLCBNUi5RM191cF9wbHVzLCBNUi5RNF91cF9wbHVzKQpNUi5Rcy5taW51cy5saXN0IDwtIGxpc3QoTVIuUTFfdXBfbWludXMsIE1SLlEyX3VwX21pbnVzLCBNUi5RM191cF9taW51cywgTVIuUTRfdXBfbWludXMpCk1SLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoTVIuUTFfZG93bl9wbHVzLCBNUi5RMl9kb3duX3BsdXMsIE1SLlEzX2Rvd25fcGx1cywgTVIuUTRfZG93bl9wbHVzKQpNUi5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChNUi5RMV9kb3duX21pbnVzLCBNUi5RMl9kb3duX21pbnVzLCBNUi5RM19kb3duX21pbnVzLCBNUi5RNF9kb3duX21pbnVzKQpNUi53aW5kb3dfbGVuID0gMjAwMAoKTVIuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKE1SLlFzLnBsdXMudXAubGlzdCwgTVIuUXMubWludXMubGlzdCwgTVIuUXMucGx1cy5kb3duLmxpc3QsIE1SLlFzLm1pbnVzLmRvd24ubGlzdCwgTVIud2luZG93X2xlbikKCgpgYGAKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpTVFIuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTEuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEyLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMy5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTQuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKClNUUi5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTEuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMi5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEzLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTQuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKClNUUi5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnExLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEyLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEzLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnE0LmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpCgpTVFIuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTEuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMy5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTQuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKClNUUi5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChTVFIuUTFfdXBfcGx1cywgU1RSLlEyX3VwX3BsdXMsIFNUUi5RM191cF9wbHVzLCBTVFIuUTRfdXBfcGx1cykKU1RSLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChTVFIuUTFfdXBfbWludXMsIFNUUi5RMl91cF9taW51cywgU1RSLlEzX3VwX21pbnVzLCBTVFIuUTRfdXBfbWludXMpClNUUi5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KFNUUi5RMV9kb3duX3BsdXMsIFNUUi5RMl9kb3duX3BsdXMsIFNUUi5RM19kb3duX3BsdXMsIFNUUi5RNF9kb3duX3BsdXMpClNUUi5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChTVFIuUTFfZG93bl9taW51cywgU1RSLlEyX2Rvd25fbWludXMsIFNUUi5RM19kb3duX21pbnVzLCBTVFIuUTRfZG93bl9taW51cykKU1RSLndpbmRvd19sZW4gPSAyMDAwCgpTVFIuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKFNUUi5Rcy5wbHVzLnVwLmxpc3QsIFNUUi5Rcy5taW51cy5saXN0LCBTVFIuUXMucGx1cy5kb3duLmxpc3QsIFNUUi5Rcy5taW51cy5kb3duLmxpc3QsIFNUUi53aW5kb3dfbGVuKQoKYGBgCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKWl9ETkEuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTEuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEyLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMy5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTQuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpCgpaX0ROQS5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTEuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMi5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEzLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTQuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpCgpaX0ROQS5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnExLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEyLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEzLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnE0LmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQoKWl9ETkEuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTEuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMy5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTQuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpCgpaX0ROQS5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChaX0ROQS5RMV91cF9wbHVzLCBaX0ROQS5RMl91cF9wbHVzLCBaX0ROQS5RM191cF9wbHVzLCBaX0ROQS5RNF91cF9wbHVzKQpaX0ROQS5Rcy5taW51cy5saXN0IDwtIGxpc3QoWl9ETkEuUTFfdXBfbWludXMsIFpfRE5BLlEyX3VwX21pbnVzLCBaX0ROQS5RM191cF9taW51cywgWl9ETkEuUTRfdXBfbWludXMpClpfRE5BLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoWl9ETkEuUTFfZG93bl9wbHVzLCBaX0ROQS5RMl9kb3duX3BsdXMsIFpfRE5BLlEzX2Rvd25fcGx1cywgWl9ETkEuUTRfZG93bl9wbHVzKQpaX0ROQS5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChaX0ROQS5RMV9kb3duX21pbnVzLCBaX0ROQS5RMl9kb3duX21pbnVzLCBaX0ROQS5RM19kb3duX21pbnVzLCBaX0ROQS5RNF9kb3duX21pbnVzKQpaX0ROQS53aW5kb3dfbGVuID0gMjAwMAoKWl9ETkEuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKFpfRE5BLlFzLnBsdXMudXAubGlzdCwgWl9ETkEuUXMubWludXMubGlzdCwgWl9ETkEuUXMucGx1cy5kb3duLmxpc3QsIFpfRE5BLlFzLm1pbnVzLmRvd24ubGlzdCwgWl9ETkEud2luZG93X2xlbikKCmBgYAoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD03fQpHNC5Rcy50b3RhbFssIE5vbl9COj0iRzQiXQpEUi5Rcy50b3RhbFssIE5vbl9COj0iRFIiXQpIX0ROQS5Rcy50b3RhbFssIE5vbl9COj0iSC1ETkEiXQpJUi5Rcy50b3RhbFssIE5vbl9COj0iSVIiXQpNUi5Rcy50b3RhbFssIE5vbl9COj0iTVIiXQpTVFIuUXMudG90YWxbLCBOb25fQjo9IlNUUiJdClpfRE5BLlFzLnRvdGFsWywgTm9uX0I6PSJaLUROQSJdCgoKCk5vbl9CLlFzLlRPVEFMIDwtIHJiaW5kKEc0LlFzLnRvdGFsLCBEUi5Rcy50b3RhbCwgSF9ETkEuUXMudG90YWwsIElSLlFzLnRvdGFsLCBNUi5Rcy50b3RhbCwgU1RSLlFzLnRvdGFsLCBaX0ROQS5Rcy50b3RhbCkKCk5vbl9CLlFzLlRPVEFMJFEgPC0gbWFwdmFsdWVzKE5vbl9CLlFzLlRPVEFMJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQoKCgpnZ3Bsb3QoTm9uX0IuUXMuVE9UQUwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggTm9uX0IgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKYGBgCgoKCgoKYGBge3J9Ck5vbl9CLlFzLlRPVEFMLkVucnJpY2htZW50X1BlYWsgPC0gTm9uX0IuUXMuVE9UQUxbICAsIC4oRW5ycmljaG1lbnRfUGVhaz1tYXgoRW5ycmljaG1lbnQpKSAsIGJ5PSBjKCJOb25fQiIsICJleG9uX3BvcyIsICJRIildCgp3cml0ZS50YWJsZShOb25fQi5Rcy5UT1RBTC5FbnJyaWNobWVudF9QZWFrLCBmaWxlID0gIi4vVGFibGVzL05vbl9CLlFzLlRPVEFMLkVucnJpY2htZW50X1BlYWsudHh0IiwgYXBwZW5kID0gRkFMU0UsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICJcdCIsCiAgICAgICAgICAgIGVvbCA9ICJcbiIsIG5hID0gIk5BIiwgZGVjID0gIi4iLCByb3cubmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgcW1ldGhvZCA9IGMoImVzY2FwZSIsICJkb3VibGUiKSwKICAgICAgICAgICAgZmlsZUVuY29kaW5nID0gIiIpCmBgYAoKCgoKCgoKIyBUZW1wbGF0ZSAtIG5vbiB0ZW1wbGF0ZQoKClRvIGludmVzdGlnYXRlIGlmIHRoZSBkaXN0cmlidXRpb24gb2Ygbm9uLUIgRE5BIG1vdGlmcyBpcyBiaWFzZWQgYnkgdHJhbnNjcmlwdGlvbiBkaXJlY3Rpb24sIHdlIGdlbmVyYXRlIGAubnVtYCBmaWxlcyB3aGVyZSB0aGUgY291bnRzIHdlcmUgc2VwYXJhdGVkIGJ5IHRlbXBsYXRlIGFuZCBub24gdGVtcGxhdGVkIHN0cmFuZHM6CgoKKiBUZW1wbGF0ZSA9IHBsdXNfbWludXMsIG1pbnVzX3BsdXMKKiBOb24tdGVtcGxhdGUgPSBtaW51c19taW51cywgcGx1c19wbHVzCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKRzQudGVtcGxhdGUuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfcGx1cy5xMS5iZWQuRzRzX21pbnVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnEyLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX3BsdXMucTMuYmVkLkc0c19taW51c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfcGx1cy5xNC5iZWQuRzRzX21pbnVzX3BsdXMubGlzdC5maW5hbC5udW0iKQoKRzQudGVtcGxhdGUuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX21pbnVzLnExLmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9taW51cy5xMi5iZWQuRzRzX3BsdXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTMuYmVkLkc0c19wbHVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX21pbnVzLnE0LmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCgpHNC50ZW1wbGF0ZS5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fcGx1cy5xMS5iZWQuRzRzX21pbnVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fcGx1cy5xMi5iZWQuRzRzX21pbnVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fcGx1cy5xMy5iZWQuRzRzX21pbnVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fcGx1cy5xNC5iZWQuRzRzX21pbnVzX3BsdXMubGlzdC5maW5hbC5udW0iKQoKRzQudGVtcGxhdGUuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9taW51cy5xMS5iZWQuRzRzX3BsdXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fbWludXMucTMuYmVkLkc0c19wbHVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9taW51cy5xNC5iZWQuRzRzX3BsdXNfbWludXMubGlzdC5maW5hbC5udW0iKQoKCkc0Lm5vbl90ZW1wbGF0ZS5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnExLmJlZC5HNHNfcGx1c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX3BsdXMucTIuYmVkLkc0c19wbHVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfcGx1cy5xMy5iZWQuRzRzX3BsdXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnE0LmJlZC5HNHNfcGx1c19wbHVzLmxpc3QuZmluYWwubnVtIikKCkc0Lm5vbl90ZW1wbGF0ZS5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTEuYmVkLkc0c19taW51c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTIuYmVkLkc0c19taW51c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTMuYmVkLkc0c19taW51c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTQuYmVkLkc0c19taW51c19taW51cy5saXN0LmZpbmFsLm51bSIpCgpHNC5ub25fdGVtcGxhdGUuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX3BsdXMucTEuYmVkLkc0c19wbHVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX3BsdXMucTIuYmVkLkc0c19wbHVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX3BsdXMucTMuYmVkLkc0c19wbHVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX3BsdXMucTQuYmVkLkc0c19wbHVzX3BsdXMubGlzdC5maW5hbC5udW0iKQoKRzQubm9uX3RlbXBsYXRlLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fbWludXMucTEuYmVkLkc0c19taW51c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5HNHNfbWludXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9taW51cy5xMy5iZWQuRzRzX21pbnVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fbWludXMucTQuYmVkLkc0c19taW51c19taW51cy5saXN0LmZpbmFsLm51bSIpCgoKYGBgCgoKCmBgYHtyfQpHNC50ZW1wbGF0ZS5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNC50ZW1wbGF0ZS5RMV91cF9wbHVzLCBHNC50ZW1wbGF0ZS5RMl91cF9wbHVzLCBHNC50ZW1wbGF0ZS5RM191cF9wbHVzLCBHNC50ZW1wbGF0ZS5RNF91cF9wbHVzKQpHNC50ZW1wbGF0ZS5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzQudGVtcGxhdGUuUTFfdXBfbWludXMsIEc0LnRlbXBsYXRlLlEyX3VwX21pbnVzLCBHNC50ZW1wbGF0ZS5RM191cF9taW51cywgRzQudGVtcGxhdGUuUTRfdXBfbWludXMpCkc0LnRlbXBsYXRlLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzQudGVtcGxhdGUuUTFfZG93bl9wbHVzLCBHNC50ZW1wbGF0ZS5RMl9kb3duX3BsdXMsIEc0LnRlbXBsYXRlLlEzX2Rvd25fcGx1cywgRzQudGVtcGxhdGUuUTRfZG93bl9wbHVzKQpHNC50ZW1wbGF0ZS5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNC50ZW1wbGF0ZS5RMV9kb3duX21pbnVzLCBHNC50ZW1wbGF0ZS5RMl9kb3duX21pbnVzLCBHNC50ZW1wbGF0ZS5RM19kb3duX21pbnVzLCBHNC50ZW1wbGF0ZS5RNF9kb3duX21pbnVzKQpHNC50ZW1wbGF0ZS53aW5kb3dfbGVuID0gMjAwMAoKRzQudGVtcGxhdGUuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0LnRlbXBsYXRlLlFzLnBsdXMudXAubGlzdCwgRzQudGVtcGxhdGUuUXMubWludXMubGlzdCwgRzQudGVtcGxhdGUuUXMucGx1cy5kb3duLmxpc3QsIEc0LnRlbXBsYXRlLlFzLm1pbnVzLmRvd24ubGlzdCwgRzQudGVtcGxhdGUud2luZG93X2xlbikKYGBgCgoKCmBgYHtyfQpHNC5ub25fdGVtcGxhdGUuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzQubm9uX3RlbXBsYXRlLlExX3VwX3BsdXMsIEc0Lm5vbl90ZW1wbGF0ZS5RMl91cF9wbHVzLCBHNC5ub25fdGVtcGxhdGUuUTNfdXBfcGx1cywgRzQubm9uX3RlbXBsYXRlLlE0X3VwX3BsdXMpCkc0Lm5vbl90ZW1wbGF0ZS5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzQubm9uX3RlbXBsYXRlLlExX3VwX21pbnVzLCBHNC5ub25fdGVtcGxhdGUuUTJfdXBfbWludXMsIEc0Lm5vbl90ZW1wbGF0ZS5RM191cF9taW51cywgRzQubm9uX3RlbXBsYXRlLlE0X3VwX21pbnVzKQpHNC5ub25fdGVtcGxhdGUuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNC5ub25fdGVtcGxhdGUuUTFfZG93bl9wbHVzLCBHNC5ub25fdGVtcGxhdGUuUTJfZG93bl9wbHVzLCBHNC5ub25fdGVtcGxhdGUuUTNfZG93bl9wbHVzLCBHNC5ub25fdGVtcGxhdGUuUTRfZG93bl9wbHVzKQpHNC5ub25fdGVtcGxhdGUuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzQubm9uX3RlbXBsYXRlLlExX2Rvd25fbWludXMsIEc0Lm5vbl90ZW1wbGF0ZS5RMl9kb3duX21pbnVzLCBHNC5ub25fdGVtcGxhdGUuUTNfZG93bl9taW51cywgRzQubm9uX3RlbXBsYXRlLlE0X2Rvd25fbWludXMpCkc0Lm5vbl90ZW1wbGF0ZS53aW5kb3dfbGVuID0gMjAwMAoKRzQubm9uX3RlbXBsYXRlLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNC5ub25fdGVtcGxhdGUuUXMucGx1cy51cC5saXN0LCBHNC5ub25fdGVtcGxhdGUuUXMubWludXMubGlzdCwgRzQubm9uX3RlbXBsYXRlLlFzLnBsdXMuZG93bi5saXN0LCBHNC5ub25fdGVtcGxhdGUuUXMubWludXMuZG93bi5saXN0LCBHNC50ZW1wbGF0ZS53aW5kb3dfbGVuKQpgYGAKCgpgYGB7cn0KCkc0LnRlbXBsYXRlLlFzLnRvdGFsCkc0Lm5vbl90ZW1wbGF0ZS5Rcy50b3RhbAoKCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbCA8LSByYmluZChHNC50ZW1wbGF0ZS5Rcy50b3RhbCwgRzQubm9uX3RlbXBsYXRlLlFzLnRvdGFsKQogIApoYWxmX24gPC0gbnJvdyhHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwpLzIKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsWywgU3RyYW5kOj1yZXAoYygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiksIGVhY2g9aGFsZl9uKSBdCiAgCiAgCiAgCiAgCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbCRTdHJhbmQgPC0gIGZhY3RvcihHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwkU3RyYW5kLCBsZXZlbHM9YygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiApKQoKICAKYGBgCgoKCgpgYGB7cn0KCgoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsJFEgPC0gbWFwdmFsdWVzKEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbCRRLCAgZnJvbSA9YygxOjQpLCB0byA9YygiUTEiLCAiUTIiLCAiUTMiLCAiUTQiKSkKCgoKCgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwuYmlub21pYWwgPC0gY2JpbmQoRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLCAgRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsWywgYmluY29uZihPY2N1cnJlbmNlcywgaGcxOS5uZXhvbnMvOCkgXSkKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLmJpbm9taWFsWywgbWVkaWFuOj1OVUxMXQoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLmJpbm9taWFsWyAsIG1lZGlhbjo9bWVkaWFuKFBvaW50RXN0KSwgYnk9YygiZXhvbl9wb3MiLCAiUSIsICJTdHJhbmQiKV0KRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLmJpbm9taWFsWywgYDo9YChFbnJyaWNobWVudD1Qb2ludEVzdC9tZWRpYW4sIEVucnJpY2htZW50X2w9TG93ZXIvbWVkaWFuLCBFbnJyaWNobWVudF91PVVwcGVyL21lZGlhbildCgoKRmlnMi5BIDwtIGdncGxvdChHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwuYmlub21pYWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICAgZ2VvbV9yaWJib24oYWVzKHg9UG9zaXRpb24sIGZpbGw9USwgeW1pbj1FbnJyaWNobWVudF9sLCB5bWF4PUVucnJpY2htZW50X3UpLCBhbHBoYT0wLjMpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggU3RyYW5kIH4gZXhvbl9wb3MgKSArCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZV9idygpICArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKRmlnMi5BCgpgYGAKCgoKCmBgYHtyfQoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLnRvdGFsIDwtIEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbFsgLCAuKE9jY3VycmVuY2VzPXN1bShPY2N1cnJlbmNlcykpICwgYnk9YygiU3RyYW5kIiwgImV4b25fcG9zIiwgIlBvc2l0aW9uIildCgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUudG90YWxbICwgbWVkaWFuOj1tZWRpYW4oT2NjdXJyZW5jZXMpICwgYnk9YygiU3RyYW5kIiwgImV4b25fcG9zIildCgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUudG90YWxbICwgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbiAsIGJ5PWMoIlN0cmFuZCIsICJleG9uX3BvcyIsICJQb3NpdGlvbiIpXQoKCmdncGxvdChHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogIHhsaW0oYygtMTUwLDE1MCkpICsKICBmYWNldF9ncmlkKCBTdHJhbmQgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKCmBgYAoKCmBgYHtyfQoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLnRvdGFsX1BlYWsgPC0gRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLnRvdGFsWyAgLCAuKEVucnJpY2htZW50X1BlYWs9bWF4KEVucnJpY2htZW50KSkgLCBieT0gYygiU3RyYW5kIiwgImV4b25fcG9zIildCgoKd3JpdGUudGFibGUoRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLnRvdGFsX1BlYWssIGZpbGUgPSAiLi9UYWJsZXMvRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLnRvdGFsX1BlYWsudHh0IiwgYXBwZW5kID0gRkFMU0UsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICJcdCIsCiAgICAgICAgICAgIGVvbCA9ICJcbiIsIG5hID0gIk5BIiwgZGVjID0gIi4iLCByb3cubmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgcW1ldGhvZCA9IGMoImVzY2FwZSIsICJkb3VibGUiKSwKICAgICAgICAgICAgZmlsZUVuY29kaW5nID0gIiIpCmBgYAoKCgpgYGB7cn0KCgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwuRW5ycmljaG1lbnRfUGVhayA8LSBHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWxbICAsIC4oRW5ycmljaG1lbnRfUGVhaz1tYXgoRW5ycmljaG1lbnQpKSAsIGJ5PSBjKCAiZXhvbl9wb3MiLCAiUSIsICJTdHJhbmQiICldCgp3cml0ZS50YWJsZShHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwuRW5ycmljaG1lbnRfUGVhaywgZmlsZSA9ICIuL1RhYmxlcy9HNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwuRW5ycmljaG1lbnRfUGVhay50eHQiLCBhcHBlbmQgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIlx0IiwKICAgICAgICAgICAgZW9sID0gIlxuIiwgbmEgPSAiTkEiLCBkZWMgPSAiLiIsIHJvdy5uYW1lcyA9IEZBTFNFLAogICAgICAgICAgICBjb2wubmFtZXMgPSBUUlVFLCBxbWV0aG9kID0gYygiZXNjYXBlIiwgImRvdWJsZSIpLAogICAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiIikKCmBgYAoKCiMgRzQgUlVOUwoKSGVyZSB3ZSBleHBsb3JlZCB0aGUgZW5yaWNobWVudCBvZiBHLXF1YWRydXBsZXhlcyB3aXRoIGRpZmZlcmVudCBHLXJ1biBsZW5ndGgKCgpgYGB7ciwgIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKRzFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLnVwX3BsdXMuYmVkLlNpbmdsZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLnVwX3BsdXMuYmVkLlR3aWNlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfcGx1cy5iZWQuVGhyZWVfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi51cF9wbHVzLmJlZC5Gb3VyX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfcGx1cy5iZWQuRml2ZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzZfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLnVwX3BsdXMuYmVkLlNpeF9HX3J1bnMubGlzdC5vdXQubnVtIikKCkcxX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfbWludXMuYmVkLlNpbmdsZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi51cF9taW51cy5iZWQuVHdpY2VfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkczX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24udXBfbWludXMuYmVkLlRocmVlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLnVwX21pbnVzLmJlZC5Gb3VyX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLnVwX21pbnVzLmJlZC5GaXZlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLnVwX21pbnVzLmJlZC5TaXhfR19ydW5zLmxpc3Qub3V0Lm51bSIpCgpHMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX3BsdXMuYmVkLlNpbmdsZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24uZG93bl9wbHVzLmJlZC5Ud2ljZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24uZG93bl9wbHVzLmJlZC5UaHJlZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24uZG93bl9wbHVzLmJlZC5Gb3VyX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX3BsdXMuYmVkLkZpdmVfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc2X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLmRvd25fcGx1cy5iZWQuU2l4X0dfcnVucy5saXN0Lm91dC5udW0iKQoKRzFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLmRvd25fbWludXMuYmVkLlNpbmdsZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfcnVucy9leG9uLmRvd25fbWludXMuYmVkLlR3aWNlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24uZG93bl9taW51cy5iZWQuVGhyZWVfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX21pbnVzLmJlZC5Gb3VyX0dfcnVucy5saXN0Lm91dC5udW0iKSAgCkc1X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3J1bnMvZXhvbi5kb3duX21pbnVzLmJlZC5GaXZlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9ydW5zL2V4b24uZG93bl9taW51cy5iZWQuU2l4X0dfcnVucy5saXN0Lm91dC5udW0iKQpgYGAKCgoKYGBge3J9CkdydW5zLnVwX3BsdXMubGlzdCA8LSBsaXN0KEcxX3VwX3BsdXMsIEcyX3VwX3BsdXMsIEczX3VwX3BsdXMsIEc0X3VwX3BsdXMsIEc1X3VwX3BsdXMsIEc2X3VwX3BsdXMpCkdydW5zLnVwX21pbnVzLmxpc3QgPC0gbGlzdChHMV91cF9taW51cywgRzJfdXBfbWludXMsIEczX3VwX21pbnVzLCBHNF91cF9taW51cywgRzVfdXBfbWludXMsIEc2X3VwX21pbnVzKQoKR3J1bnMuZG93bl9wbHVzLmxpc3QgPC0gbGlzdChHMV9kb3duX3BsdXMsIEcyX2Rvd25fcGx1cywgRzNfZG93bl9wbHVzLCBHNF9kb3duX3BsdXMsIEc1X2Rvd25fcGx1cywgRzZfZG93bl9wbHVzKQpHcnVucy5kb3duX21pbnVzLmxpc3QgPC0gbGlzdChHMV9kb3duX21pbnVzLCBHMl9kb3duX21pbnVzLCBHM19kb3duX21pbnVzLCBHNF9kb3duX21pbnVzLCBHNV9kb3duX21pbnVzLCBHNl9kb3duX21pbnVzKQoKCkdydW5zLndpbmRvd19sZW4gPSAyMDAwCgpHcnVucy50b3RhbCA8LSBnZXRfdG90YWxfUXMoR3J1bnMudXBfcGx1cy5saXN0LCBHcnVucy51cF9taW51cy5saXN0LCBHcnVucy5kb3duX3BsdXMubGlzdCwgR3J1bnMuZG93bl9taW51cy5saXN0LCBHcnVucy53aW5kb3dfbGVuKQoKR3J1bnMudG90YWxbLCBHX3J1bl9sZW5ndGg6PVFdCmBgYAoKCgpgYGB7cn0KCgpHcnVucy50b3RhbC5iaW5vbWlhbCA8LSBjYmluZChHcnVucy50b3RhbCwgIEdydW5zLnRvdGFsWywgYmluY29uZihPY2N1cnJlbmNlcywgaGcxOS5uZXhvbnMpIF0pCkdydW5zLnRvdGFsLmJpbm9taWFsWywgbWVkaWFuOj1OVUxMXQoKR3J1bnMudG90YWwuYmlub21pYWxbICwgbWVkaWFuOj1tZWRpYW4oUG9pbnRFc3QpLCBieT1jKCJleG9uX3BvcyIsICJRIiApXQpHcnVucy50b3RhbC5iaW5vbWlhbFssIGA6PWAoRW5ycmljaG1lbnQ9UG9pbnRFc3QvbWVkaWFuLCBFbnJyaWNobWVudF9sPUxvd2VyL21lZGlhbiwgRW5ycmljaG1lbnRfdT1VcHBlci9tZWRpYW4pXQoKCkZpZzIuQiA8LSBnZ3Bsb3QoR3J1bnMudG90YWwuYmlub21pYWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9R19ydW5fbGVuZ3RoKSkgKwogIGdlb21fcmliYm9uKGFlcyh4PVBvc2l0aW9uLCBmaWxsPVEsIHltaW49RW5ycmljaG1lbnRfbCwgeW1heD1FbnJyaWNobWVudF91KSwgYWxwaGE9MC4zKSArCiAgeGxpbShjKC0xMDAsMTAwKSkgKwogIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyhjb2xvdXIgPSAiTnVtYmVyIG9mIGNvbnNlY3V0aXZlIEctcnVucyIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgpGaWcyLkIKYGBgCgoKCgoKYGBge3J9CgpHcnVucy50b3RhbC5FbnJyaWNobWVudF9QZWFrIDwtIEdydW5zLnRvdGFsWyAgLCAuKEVucnJpY2htZW50X1BlYWs9bWF4KEVucnJpY2htZW50KSkgLCBieT0gYyggImV4b25fcG9zIiwgIkdfcnVuX2xlbmd0aCIpXQoKd3JpdGUudGFibGUoR3J1bnMudG90YWwuRW5ycmljaG1lbnRfUGVhaywgZmlsZSA9ICIuL1RhYmxlcy9HcnVucy50b3RhbC5FbnJyaWNobWVudF9QZWFrLnR4dCIsIGFwcGVuZCA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLAogICAgICAgICAgICBlb2wgPSAiXG4iLCBuYSA9ICJOQSIsIGRlYyA9ICIuIiwgcm93Lm5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgIGNvbC5uYW1lcyA9IFRSVUUsIHFtZXRob2QgPSBjKCJlc2NhcGUiLCAiZG91YmxlIiksCiAgICAgICAgICAgIGZpbGVFbmNvZGluZyA9ICIiKQpgYGAKCgoKCgoKCiMjIEc0IGVucmljaG1lbnQgYWNyb3NzIGV2b2x1dGlvbgoKCgoKV2UgYW5hbHl6ZWQgdGhlIEc0IGVucmljaG1lbnQgYWNyb3NzIHNwbGljZSBzaXRlcyBmcm9tIGRpZmZlcmVudCBzcGVjaWVzCgoKCmBgYHtyLCAgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpzdXNTY3IxMS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vc3VzU2NyMTEuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5zdXNTY3IxMS50eHQuLmxpc3Qub3V0Lm51bSIpCnN1c1NjcjExLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL3N1c1NjcjExLmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS5zdXNTY3IxMS50eHQuLmxpc3Qub3V0Lm51bSIpCnN1c1NjcjExLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vc3VzU2NyMTEuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuc3VzU2NyMTEudHh0Li5saXN0Lm91dC5udW0iKQpzdXNTY3IxMS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vc3VzU2NyMTEuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5zdXNTY3IxMS50eHQuLmxpc3Qub3V0Lm51bSIpCnN1c1NjcjExLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCnN1c1NjcjExLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCnN1c1NjcjExLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShzdXNTY3IxMS51cF9wbHVzLCBzdXNTY3IxMS51cF9taW51cywgc3VzU2NyMTEuZG93bl9wbHVzLCBzdXNTY3IxMS5kb3duX21pbnVzKQoKCmBgYAoKCgoKCmBgYHtyLCAgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpUQUlSMTAudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL1RBSVIxMC5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLlRBSVIxMC50eHQuLmxpc3Qub3V0Lm51bSIpClRBSVIxMC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9UQUlSMTAuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLlRBSVIxMC50eHQuLmxpc3Qub3V0Lm51bSIpClRBSVIxMC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL1RBSVIxMC5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5UQUlSMTAudHh0Li5saXN0Lm91dC5udW0iKQpUQUlSMTAuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL1RBSVIxMC5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLlRBSVIxMC50eHQuLmxpc3Qub3V0Lm51bSIpClRBSVIxMC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpUQUlSMTAuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKVEFJUjEwLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShUQUlSMTAudXBfcGx1cywgVEFJUjEwLnVwX21pbnVzLCBUQUlSMTAuZG93bl9wbHVzLCBUQUlSMTAuZG93bl9taW51cykKCgpgYGAKCgoKCgoKYGBge3IsICBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmFub0NhcjIudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2Fub0NhcjIuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5hbm9DYXIyLnR4dC4ubGlzdC5vdXQubnVtIikKYW5vQ2FyMi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9hbm9DYXIyLmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS5hbm9DYXIyLnR4dC4ubGlzdC5vdXQubnVtIikKYW5vQ2FyMi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2Fub0NhcjIuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuYW5vQ2FyMi50eHQuLmxpc3Qub3V0Lm51bSIpCmFub0NhcjIuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2Fub0NhcjIuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5hbm9DYXIyLnR4dC4ubGlzdC5vdXQubnVtIikKYW5vQ2FyMi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQphbm9DYXIyLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmFub0NhcjIuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGFub0NhcjIudXBfcGx1cywgYW5vQ2FyMi51cF9taW51cywgYW5vQ2FyMi5kb3duX3BsdXMsIGFub0NhcjIuZG93bl9taW51cykKCgpgYGAKCgoKYGBge3IsICBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnhlblRybzkudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL3hlblRybzkuZXhvbi51cF9wbHVzLmJlZC5zY29yZS54ZW5Ucm85LnR4dC4ubGlzdC5vdXQubnVtIikKeGVuVHJvOS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi94ZW5Ucm85LmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS54ZW5Ucm85LnR4dC4ubGlzdC5vdXQubnVtIikKeGVuVHJvOS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL3hlblRybzkuZXhvbi51cF9taW51cy5iZWQuc2NvcmUueGVuVHJvOS50eHQuLmxpc3Qub3V0Lm51bSIpCnhlblRybzkuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL3hlblRybzkuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS54ZW5Ucm85LnR4dC4ubGlzdC5vdXQubnVtIikKeGVuVHJvOS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQp4ZW5Ucm85LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCnhlblRybzkuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KHhlblRybzkudXBfcGx1cywgeGVuVHJvOS51cF9taW51cywgeGVuVHJvOS5kb3duX3BsdXMsIHhlblRybzkuZG93bl9taW51cykKCgpgYGAKCgoKCmBgYHtyLCAgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpjZTEwLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9jZTEwLmV4b24udXBfcGx1cy5iZWQuc2NvcmUuY2UxMC50eHQuLmxpc3Qub3V0Lm51bSIpCmNlMTAuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vY2UxMC5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuY2UxMC50eHQuLmxpc3Qub3V0Lm51bSIpCmNlMTAudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9jZTEwLmV4b24udXBfbWludXMuYmVkLnNjb3JlLmNlMTAudHh0Li5saXN0Lm91dC5udW0iKQpjZTEwLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9jZTEwLmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuY2UxMC50eHQuLmxpc3Qub3V0Lm51bSIpCmNlMTAudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KY2UxMC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpjZTEwLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShjZTEwLnVwX3BsdXMsIGNlMTAudXBfbWludXMsIGNlMTAuZG93bl9wbHVzLCBjZTEwLmRvd25fbWludXMpCgoKYGBgCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKZGFuUmVyMTEudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2RhblJlcjExLmV4b24udXBfcGx1cy5iZWQuc2NvcmUuZGFuUmVyMTEudHh0Li5saXN0Lm91dC5udW0iKQpkYW5SZXIxMS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9kYW5SZXIxMS5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuZGFuUmVyMTEudHh0Li5saXN0Lm91dC5udW0iKQpkYW5SZXIxMS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2RhblJlcjExLmV4b24udXBfbWludXMuYmVkLnNjb3JlLmRhblJlcjExLnR4dC4ubGlzdC5vdXQubnVtIikKZGFuUmVyMTEuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2RhblJlcjExLmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuZGFuUmVyMTEudHh0Li5saXN0Lm91dC5udW0iKQpkYW5SZXIxMS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpkYW5SZXIxMS5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpkYW5SZXIxMS5UT1RBTCA8LSBwbG90X2RlbnNpdHkoZGFuUmVyMTEudXBfcGx1cywgZGFuUmVyMTEudXBfbWludXMsIGRhblJlcjExLmRvd25fcGx1cywgZGFuUmVyMTEuZG93bl9taW51cykKCgpgYGAKCmBgYHtyLCAgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgptbTEwLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9tbTEwLmV4b24udXBfcGx1cy5iZWQuc2NvcmUubW0xMC50eHQuLmxpc3Qub3V0Lm51bSIpCm1tMTAuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vbW0xMC5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUubW0xMC50eHQuLmxpc3Qub3V0Lm51bSIpCm1tMTAudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9tbTEwLmV4b24udXBfbWludXMuYmVkLnNjb3JlLm1tMTAudHh0Li5saXN0Lm91dC5udW0iKQptbTEwLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9tbTEwLmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUubW0xMC50eHQuLmxpc3Qub3V0Lm51bSIpCm1tMTAudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KbW0xMC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgptbTEwLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShtbTEwLnVwX3BsdXMsIG1tMTAudXBfbWludXMsIG1tMTAuZG93bl9wbHVzLCBtbTEwLmRvd25fbWludXMpCgoKYGBgCgoKYGBge3IsICBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmhnMTkudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2hnMTkuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5oZzE5LnR4dC4ubGlzdC5vdXQubnVtIikKaGcxOS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9oZzE5LmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS5oZzE5LnR4dC4ubGlzdC5vdXQubnVtIikKaGcxOS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2hnMTkuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuaGcxOS50eHQuLmxpc3Qub3V0Lm51bSIpCmhnMTkuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2hnMTkuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5oZzE5LnR4dC4ubGlzdC5vdXQubnVtIikKaGcxOS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpoZzE5LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmhnMTkuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGhnMTkudXBfcGx1cywgaGcxOS51cF9taW51cywgaGcxOS5kb3duX3BsdXMsIGhnMTkuZG93bl9taW51cykKCgpgYGAKCgoKCmBgYHtyLCAgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpkbTYudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2RtNi5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLmRtNi50eHQuLmxpc3Qub3V0Lm51bSIpCmRtNi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0V2b2x1dGlvbi9kbTYuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLmRtNi50eHQuLmxpc3Qub3V0Lm51bSIpCmRtNi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2RtNi5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5kbTYudHh0Li5saXN0Lm91dC5udW0iKQpkbTYuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2RtNi5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLmRtNi50eHQuLmxpc3Qub3V0Lm51bSIpCmRtNi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpkbTYuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZG02LlRPVEFMIDwtIHBsb3RfZGVuc2l0eShkbTYudXBfcGx1cywgZG02LnVwX21pbnVzLCBkbTYuZG93bl9wbHVzLCBkbTYuZG93bl9taW51cykKCgpgYGAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKZ2FsR2FsNS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZ2FsR2FsNS5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLmdhbEdhbDUudHh0Li5saXN0Lm91dC5udW0iKQpnYWxHYWw1LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL2dhbEdhbDUuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLmdhbEdhbDUudHh0Li5saXN0Lm91dC5udW0iKQpnYWxHYWw1LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZ2FsR2FsNS5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5nYWxHYWw1LnR4dC4ubGlzdC5vdXQubnVtIikKZ2FsR2FsNS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vZ2FsR2FsNS5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLmdhbEdhbDUudHh0Li5saXN0Lm91dC5udW0iKQpnYWxHYWw1LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmdhbEdhbDUuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZ2FsR2FsNS5UT1RBTCA8LSBwbG90X2RlbnNpdHkoZ2FsR2FsNS51cF9wbHVzLCBnYWxHYWw1LnVwX21pbnVzLCBnYWxHYWw1LmRvd25fcGx1cywgZ2FsR2FsNS5kb3duX21pbnVzKQoKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnNhY0Nlci51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vc2FjQ2VyMy5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLnNhY0NlcjMudHh0Li5saXN0Lm91dC5udW0iKQpzYWNDZXIuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vc2FjQ2VyMy5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuc2FjQ2VyMy50eHQuLmxpc3Qub3V0Lm51bSIpCnNhY0Nlci51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRXZvbHV0aW9uL3NhY0NlcjMuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuc2FjQ2VyMy50eHQuLmxpc3Qub3V0Lm51bSIpCnNhY0Nlci5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9Fdm9sdXRpb24vc2FjQ2VyMy5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLnNhY0NlcjMudHh0Li5saXN0Lm91dC5udW0iKQpzYWNDZXIudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0Kc2FjQ2VyLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCnNhY0Nlci5UT1RBTCA8LSBwbG90X2RlbnNpdHkoc2FjQ2VyLnVwX3BsdXMsIHNhY0Nlci51cF9taW51cywgc2FjQ2VyLmRvd25fcGx1cywgc2FjQ2VyLmRvd25fbWludXMpCgoKYGBgCgoKCgoKYGBge3IgfQoKCgpjZTEwLlRPVEFMWywgc3BlY2llczo9IkMuIGVsZWdhbnMiXSAKaGcxOS5UT1RBTFssIHNwZWNpZXM6PSJILiBzYXBpZW5zIl0gCm1tMTAuVE9UQUxbLCBzcGVjaWVzOj0iTS4gbXVzY3VsdXMiXQpkYW5SZXIxMS5UT1RBTFssIHNwZWNpZXM6PSJELiByZXJpbyJdIApkbTYuVE9UQUxbLCBzcGVjaWVzOj0iRC4gbWVsYW5vZ2FzdGVyIl0KZ2FsR2FsNS5UT1RBTFssIHNwZWNpZXM6PSJHLiBnYWxsdXMiXQpzYWNDZXIuVE9UQUxbLCBzcGVjaWVzOj0iUy4gY2VyZXZpc2lhZSJdCgoKeGVuVHJvOS5UT1RBTFsgLCBzcGVjaWVzOj0iWC4gdHJvcGljYWxpcyIgXQphbm9DYXIyLlRPVEFMWyAgLCBzcGVjaWVzOj0iQS4gY2Fyb2xpbmVuc2lzIiBdClRBSVIxMC5UT1RBTFsgICwgc3BlY2llczo9IkEuIHRoYWxpYW5hIiBdCnN1c1NjcjExLlRPVEFMWyAsIHNwZWNpZXM6PSJTLiBzY3JvZmEiXQoKQWxsLnNwZWNpZXMuVE9UQUwgPC0gcmJpbmQoaGcxOS5UT1RBTCwgbW0xMC5UT1RBTCwgZ2FsR2FsNS5UT1RBTCwgZGFuUmVyMTEuVE9UQUwsIGFub0NhcjIuVE9UQUwsIHhlblRybzkuVE9UQUwsICBzdXNTY3IxMS5UT1RBTCAgKQoKCiNBbGwuc3BlY2llcy5UT1RBTC5iaW5vbWlhbCA8LSBjYmluZChBbGwuc3BlY2llcy5UT1RBTCwgIEdydW5zLnRvdGFsWywgYmluY29uZihPY2N1cnJlbmNlcywgaGcxOS5uZXhvbnMpIF0pCiNBbGwuc3BlY2llcy5UT1RBTC5iaW5vbWlhbFssIG1lZGlhbjo9TlVMTF0KCiNBbGwuc3BlY2llcy5UT1RBTC5iaW5vbWlhbFsgLCBtZWRpYW46PW1lZGlhbihQb2ludEVzdCksIGJ5PWMoImV4b25fcG9zIiwgInNwZWNpZXMiICldCiNBbGwuc3BlY2llcy5UT1RBTC5iaW5vbWlhbFssIGA6PWAoRW5ycmljaG1lbnQ9UG9pbnRFc3QvbWVkaWFuLCBFbnJyaWNobWVudF9sPUxvd2VyL21lZGlhbiwgRW5ycmljaG1lbnRfdT1VcHBlci9tZWRpYW4pXQoKCgpGaWc2LkIgPC0gZ2dwbG90KEFsbC5zcGVjaWVzLlRPVEFMKSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvcj1zcGVjaWVzKSkgKwogICAgIyAgIGdlb21fcmliYm9uKGFlcyh4PVBvc2l0aW9uLCBmaWxsPXNwZWNpZXMsIHltaW49RW5ycmljaG1lbnRfbCwgeW1heD1FbnJyaWNobWVudF91KSwgYWxwaGE9MC4zKSArCiAgICB4bGltKGMoLTMwMCwzMDApKSArCiAgICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB0aGVtZV9idygpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCkZpZzYuQgoKYGBgCgpXZSBwbG90IG90aGVyIHNwZWNpZXMgdGhhdCBkaWQgbm90IHNob3cgc3Ryb25nIGVucmljaG1lbnQgYnkgc2VwYXJhdGUKCmBgYHtyfQoKQWxsLnNwZWNpZXMuVE9UQUwgPC0gcmJpbmQoY2UxMC5UT1RBTCwgZG02LlRPVEFMLCBUQUlSMTAuVE9UQUwgICkKCgoKZ2dwbG90KEFsbC5zcGVjaWVzLlRPVEFMKSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvcj1zcGVjaWVzKSkgKwogICAgeGxpbShjKC0zMDAsMzAwKSkgKwogICAgZ2d0aXRsZSggIk5vbi12ZXJ0ZWJyYXRlcyIpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHRoZW1lX2J3KCkKYGBgCgoKCiMgRzQgYW5kIGdlbmUgc3RydWN0dXJlCgoKIyMgRmxhbmtpbmcgaW50cm9uIHNpemUgCgpIZXJlIHdlIGFuYWxpemVkIHRoZSBpbnRyb24gc2l6ZSBvZiBkaXN0cmlidXRpb24gb2YgZXhvbiB3aGljaCBhcmUgZmxhbmtlZCBieSBHNCAob24gYW4gMTAwbnQgd2luZG93KQoKCgpgYGB7cn0KCgppbnRyb25fc2l6ZV91cHN0cmVhbV9ub25fdGVtcGxhdGUgIDwtIHJiaW5kKGZyZWFkKCcuL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV91cHN0cmVhbV8xMDBudF93aW5kb3cuYmVkLnBsdXNfc3RyYW5kX2dlbm9tZS5wbHVzX0c0cycpLCAgCiBmcmVhZCgnLi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfdXBzdHJlYW1fMTAwbnRfd2luZG93LmJlZC5taW51c19zdHJhbmRfZ2Vub21lLm1pbnVzX0c0cycpKQoKaW50cm9uX3NpemVfZG93bnN0cmVhbV9ub25fdGVtcGxhdGUgIDwtIHJiaW5kKGZyZWFkKCcuL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV9kb3duc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQucGx1c19zdHJhbmRfZ2Vub21lLnBsdXNfRzRzJyksICAKIGZyZWFkKCcuL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV9kb3duc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQubWludXNfc3RyYW5kX2dlbm9tZS5taW51c19HNHMnKSkKCgppbnRyb25fc2l6ZV91cHN0cmVhbV90ZW1wbGF0ZSAgPC0gcmJpbmQoZnJlYWQoJy4vSW50cm9uX3NpemUvSW50cm9ucy5oZzE5X3Vwc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQucGx1c19zdHJhbmRfZ2Vub21lLm1pbnVzX0c0cycpLCAgCiBmcmVhZCgnLi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfdXBzdHJlYW1fMTAwbnRfd2luZG93LmJlZC5taW51c19zdHJhbmRfZ2Vub21lLnBsdXNfRzRzJykpCgppbnRyb25fc2l6ZV9kb3duc3RyZWFtX3RlbXBsYXRlICA8LSByYmluZChmcmVhZCgnLi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfZG93bnN0cmVhbV8xMDBudF93aW5kb3cuYmVkLm1pbnVzX3N0cmFuZF9nZW5vbWUucGx1c19HNHMnKSwgIAogZnJlYWQoJy4vSW50cm9uX3NpemUvSW50cm9ucy5oZzE5X2Rvd25zdHJlYW1fMTAwbnRfd2luZG93LmJlZC5wbHVzX3N0cmFuZF9nZW5vbWUubWludXNfRzRzJykpCgoKaW50cm9uX3NpemVfdXBzdHJlYW1fbm9uX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9InVwc3RyZWFtIiwgc3RyYW5kPSJub25fdGVtcGxhdGUiKSBdCmludHJvbl9zaXplX2Rvd25zdHJlYW1fbm9uX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9ImRvd25zdHJlYW0iLCBzdHJhbmQ9Im5vbl90ZW1wbGF0ZSIpIF0KaW50cm9uX3NpemVfdXBzdHJlYW1fdGVtcGxhdGVbICwgYDo9YChleG9uX3Bvcz0idXBzdHJlYW0iLCBzdHJhbmQ9InRlbXBsYXRlIikgXQppbnRyb25fc2l6ZV9kb3duc3RyZWFtX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9ImRvd25zdHJlYW0iLCBzdHJhbmQ9InRlbXBsYXRlIikgXQoKaW50cm9uX3NpemVfVE9UQUwgPC0gcmJpbmQoaW50cm9uX3NpemVfdXBzdHJlYW1fbm9uX3RlbXBsYXRlLCBpbnRyb25fc2l6ZV9kb3duc3RyZWFtX25vbl90ZW1wbGF0ZSwgaW50cm9uX3NpemVfdXBzdHJlYW1fdGVtcGxhdGUsIGludHJvbl9zaXplX2Rvd25zdHJlYW1fdGVtcGxhdGUgKQoKY29sbmFtZXMoaW50cm9uX3NpemVfVE9UQUwpIDwtIGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiaW50cm9uX251bWJlciIsICJpbnRyb25fc2l6ZSIsICJUcmFuc2NyaXB0IiwgIkc0IiwgImV4b25fcG9zIiwgIlN0cmFuZCIgICkKCgpgYGAKCgoKYGBge3J9CmludHJvbl9zaXplX1RPVEFMWyAgRzQ+MCwgRzRfdHlwZTo9IldpdGggRzQiIF0KaW50cm9uX3NpemVfVE9UQUxbICBHND09MCwgRzRfdHlwZTo9IldpdGhvdXQgRzQiIF0KCmludHJvbl9zaXplX1RPVEFMJGV4b25fcG9zIDwtIGZhY3RvcihpbnRyb25fc2l6ZV9UT1RBTCRleG9uX3BvcywgbGV2ZWxzPWMoInVwc3RyZWFtIiwgImRvd25zdHJlYW0iKSkKCkZpZzMuQSA8LSBnZ3Bsb3QoZGF0YT1pbnRyb25fc2l6ZV9UT1RBTCkgKwogIGdlb21fYm94cGxvdCggYWVzKHg9RzRfdHlwZSwgeT1sb2cxMChpbnRyb25fc2l6ZSkgKSApICsKICBmYWNldF9ncmlkKCAuIH4gIGV4b25fcG9zICkgKwogIHhsYWIoIiIpKwogIHlsYWIoImxvZzEwKEludHJvbiBzaXplKSIpICsKICB0aGVtZV9idygpCgoKRmlnMy5BCgpgYGAKCgpgYGB7cn0KbG9uZ19pbnRyb25zLjVzcyA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZC5pbnRyb25fNXNzXy5iZWQuY2xvc2VzdC5HNHMiKQpzaG9ydF9pbnRyb25zLjVzcyA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQuaW50cm9uXzVzc18uYmVkLmNsb3Nlc3QuRzRzIikKbG9uZ19pbnRyb25zLjNzcyA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZC5pbnRyb25fM3NzXy5iZWQuY2xvc2VzdC5HNHMiKQpzaG9ydF9pbnRyb25zLjNzcyA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQuaW50cm9uXzNzc18uYmVkLmNsb3Nlc3QuRzRzIikKCgpjb2xuYW1lcyhsb25nX2ludHJvbnMuNXNzKSA8LSBjKCJpLmNocm9tIiwgImkuc3RhcnQiLCAiaS5lbmQiLCAiaS5pZCIsICJpLkdDIiwgImkuc3RyYW5kIiwgImcuY2hyb20iLCAiZy5zdGFydCIsICJnLmVuZCIsICJkaXN0IikKY29sbmFtZXMoc2hvcnRfaW50cm9ucy41c3MpIDwtIGMoImkuY2hyb20iLCAiaS5zdGFydCIsICJpLmVuZCIsICJpLmlkIiwgImkuR0MiLCAiaS5zdHJhbmQiLCAiZy5jaHJvbSIsICJnLnN0YXJ0IiwgImcuZW5kIiwgImRpc3QiKQpjb2xuYW1lcyhsb25nX2ludHJvbnMuM3NzKSA8LSBjKCJpLmNocm9tIiwgImkuc3RhcnQiLCAiaS5lbmQiLCAiaS5pZCIsICJpLkdDIiwgImkuc3RyYW5kIiwgImcuY2hyb20iLCAiZy5zdGFydCIsICJnLmVuZCIsICJkaXN0IikKY29sbmFtZXMoc2hvcnRfaW50cm9ucy4zc3MpIDwtIGMoImkuY2hyb20iLCAiaS5zdGFydCIsICJpLmVuZCIsICJpLmlkIiwgImkuR0MiLCAiaS5zdHJhbmQiLCAiZy5jaHJvbSIsICJnLnN0YXJ0IiwgImcuZW5kIiwgImRpc3QiKQoKbG9uZ19pbnRyb25zLmJlZCA8LSBmcmVhZCgiLi9JbnRyb25fc2l6ZS9HQ19jb3JyZWN0aW9uL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZCIpCnNob3J0X2ludHJvbnMuYmVkIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vc2hvcnRfaW50cm9ucy5zYW1lX0dDLmJlZCIpCmxvbmdfc2hvcnRfY29ycmVzcG9uZGVuY2UgPC0gIGNiaW5kKGxvbmdfaW50cm9ucy5iZWQsIHNob3J0X2ludHJvbnMuYmVkKVsgLCBjKDQsIDIsIDMgLCA1LDEwLCA4LCA5LCAxMSldCgpjb2xuYW1lcyhsb25nX3Nob3J0X2NvcnJlc3BvbmRlbmNlKSA8LSBjKCJsLmlkIiwgImwuc3RhcnQiLCAibC5lbmQiLCAibC5HQyIsICJzLmlkIiwgInMuc3RhcnQiLCAicy5lbmQiLCAicy5HQyIgICkKbG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZVssIHMubGVuOj0ocy5lbmQtcy5zdGFydCldCgoKbG9uZ19pbnRyb25zLjVzc1ssIEc0LjVzczo9RkFMU0UgXQpsb25nX2ludHJvbnMuNXNzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09IisiICYgaS5zdGFydDxnLmVuZCAsIEc0LjVzczo9VFJVRSBdCmxvbmdfaW50cm9ucy41c3NbIGRpc3Q8PTEwMCAmIGkuc3RyYW5kPT0iLSIgJiBpLnN0YXJ0PmcuZW5kICwgRzQuNXNzOj1UUlVFIF0KCnNob3J0X2ludHJvbnMuNXNzWywgRzQuNXNzOj1GQUxTRSBdCnNob3J0X2ludHJvbnMuNXNzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09IisiICYgaS5zdGFydDxnLmVuZCAsIEc0LjVzczo9VFJVRSBdCnNob3J0X2ludHJvbnMuNXNzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09Ii0iICYgaS5zdGFydD5nLmVuZCAsIEc0LjVzczo9VFJVRSBdCgpsb25nX3Nob3J0LjJ4Mi41c3MgPC0gbWF0cml4KG5yb3cgPSAyLCBjKG5yb3cobG9uZ19pbnRyb25zLjVzc1tHNC41c3M9PUZBTFNFXSksIG5yb3coc2hvcnRfaW50cm9ucy41c3NbRzQuNXNzPT1GQUxTRV0pLCBucm93KGxvbmdfaW50cm9ucy41c3NbRzQuNXNzPT1UUlVFXSksIG5yb3coc2hvcnRfaW50cm9ucy41c3NbRzQuNXNzPT1UUlVFXSkgKSkKCmNoaXNxLnRlc3QobG9uZ19zaG9ydC4yeDIuNXNzKQoKCmxvbmdfaW50cm9ucy4zc3NbLCBHNC4zc3M6PUZBTFNFIF0KbG9uZ19pbnRyb25zLjNzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSIrIiAmIGkuc3RhcnQ8Zy5lbmQgLCBHNC4zc3M6PVRSVUUgXQpsb25nX2ludHJvbnMuM3NzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09Ii0iICYgaS5zdGFydD5nLmVuZCAsIEc0LjNzczo9VFJVRSBdCgpzaG9ydF9pbnRyb25zLjNzc1ssIEc0LjNzczo9RkFMU0UgXQpzaG9ydF9pbnRyb25zLjNzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSIrIiAmIGkuc3RhcnQ8Zy5lbmQgLCBHNC4zc3M6PVRSVUUgXQpzaG9ydF9pbnRyb25zLjNzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSItIiAmIGkuc3RhcnQ+Zy5lbmQgLCBHNC4zc3M6PVRSVUUgXQoKbG9uZ19zaG9ydC4yeDIuM3NzIDwtIG1hdHJpeChucm93ID0gMiwgYyhucm93KGxvbmdfaW50cm9ucy4zc3NbRzQuM3NzPT1GQUxTRV0pLCBucm93KHNob3J0X2ludHJvbnMuM3NzW0c0LjNzcz09RkFMU0VdKSwgbnJvdyhsb25nX2ludHJvbnMuM3NzW0c0LjNzcz09VFJVRV0pLCBucm93KHNob3J0X2ludHJvbnMuM3NzW0c0LjNzcz09VFJVRV0pICkpCgpjaGlzcS50ZXN0KGxvbmdfc2hvcnQuMngyLjNzcykKCgoKCgpsb25nX2ludHJvbnMgPC0gbWVyZ2UoIGxvbmdfaW50cm9ucy41c3MsIGxvbmdfaW50cm9ucy4zc3MsIGJ5PWMoImkuaWQiLCAiaS5HQyIgKSkKc2hvcnRfaW50cm9ucyA8LSBtZXJnZSggc2hvcnRfaW50cm9ucy41c3MsIHNob3J0X2ludHJvbnMuM3NzLCBieT1jKCJpLmlkIiwgImkuR0MiICkpCgoKCgoKbG9uZ19zaG9ydC4yeDIgPC0gbWF0cml4KG5yb3cgPSAyLCBjKG5yb3cobG9uZ19pbnRyb25zWyghRzQuM3NzICYgIUc0LjVzcyksIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coc2hvcnRfaW50cm9uc1soIUc0LjNzcyAmICFHNC41c3MpLCBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93KGxvbmdfaW50cm9uc1soRzQuM3NzIHwgRzQuNXNzKSwgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyhzaG9ydF9pbnRyb25zWyhHNC4zc3MgfCBHNC41c3MpLCBdKSApKQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmNoaXNxLnRlc3QobG9uZ19zaG9ydC4yeDIpCgoKIyMgT25seSBjb25zaWRlcmluZyBzaG9ydCBpbnRyb25zIGxvbmdlciB0aGFuIDUwCgoKCgoKbG9uZ19pbnRyb25zIDwtIGxvbmdfaW50cm9uc1tpLmlkICVpbiUgbG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZVtzLmxlbj41MCwgbC5pZF1dCnNob3J0X2ludHJvbnMgPC0gc2hvcnRfaW50cm9uc1tpLmlkICVpbiUgbG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZVtzLmxlbj41MCwgcy5pZF1dCgoKbG9uZ19zaG9ydC4yeDIgPC0gbWF0cml4KG5yb3cgPSAyLCBjKG5yb3cobG9uZ19pbnRyb25zWyghRzQuM3NzICYgIUc0LjVzcyksIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coc2hvcnRfaW50cm9uc1soIUc0LjNzcyAmICFHNC41c3MpLCBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93KGxvbmdfaW50cm9uc1soRzQuM3NzIHwgRzQuNXNzKSwgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyhzaG9ydF9pbnRyb25zWyhHNC4zc3MgfCBHNC41c3MpLCBdKSApKQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmNoaXNxLnRlc3QobG9uZ19zaG9ydC4yeDIpCgoKCnNob3J0X2ludHJvbnNbLCB0eXBlOj0iU2hvcnQiXQpsb25nX2ludHJvbnNbLCB0eXBlOj0iTG9uZyJdCgpsb25nX2ludHJvbnMkdHlwZSA8LSBmYWN0b3IobG9uZ19pbnRyb25zJHR5cGUsIGxldmVscz1jKCJTaG9ydCIsICJMb25nIikpCgoKCmxvbmdfc2hvcnRfaW50cm9ucyA8LSByYmluZChsb25nX2ludHJvbnMsIHNob3J0X2ludHJvbnMpCgpnZ3Bsb3QobG9uZ19zaG9ydF9pbnRyb25zKSArCiAgZ2VvbV92aW9saW4oYWVzKCB0eXBlLCBpLkdDKSkKCgpnZ3Bsb3QobG9uZ19zaG9ydF9pbnRyb25zKSArCiAgZ2VvbV9iYXIoYWVzKHg9dHlwZSwgZmlsbD0oKEc0LjNzcyB8IEc0LjVzcykgKSwgc3RhdD0iY291bnQiICkpCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKYGBgCgoKCmBgYHtyfQpsb25nX2ludHJvbnMuNXNzIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZC5pbnRyb25fNXNzLmJlZC5jbG9zZXN0Lkc0cyIpCnNob3J0X2ludHJvbnMuNXNzIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQuaW50cm9uXzVzcy5iZWQuY2xvc2VzdC5HNHMiKQpsb25nX2ludHJvbnMuM3NzIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZC5pbnRyb25fM3NzLmJlZC5jbG9zZXN0Lkc0cyIpCnNob3J0X2ludHJvbnMuM3NzIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQuaW50cm9uXzNzcy5iZWQuY2xvc2VzdC5HNHMiKQoKCmNvbG5hbWVzKGxvbmdfaW50cm9ucy41c3MpIDwtIGMoImkuY2hyb20iLCAiaS5zdGFydCIsICJpLmVuZCIsICJpLmlkIiwgImkuR0MiLCAiaS5zdHJhbmQiLCAiZy5jaHJvbSIsICJnLnN0YXJ0IiwgImcuZW5kIiwgImRpc3QiKQpjb2xuYW1lcyhzaG9ydF9pbnRyb25zLjVzcykgPC0gYygiaS5jaHJvbSIsICJpLnN0YXJ0IiwgImkuZW5kIiwgImkuaWQiLCAiaS5HQyIsICJpLnN0cmFuZCIsICJnLmNocm9tIiwgImcuc3RhcnQiLCAiZy5lbmQiLCAiZGlzdCIpCmNvbG5hbWVzKGxvbmdfaW50cm9ucy4zc3MpIDwtIGMoImkuY2hyb20iLCAiaS5zdGFydCIsICJpLmVuZCIsICJpLmlkIiwgImkuR0MiLCAiaS5zdHJhbmQiLCAiZy5jaHJvbSIsICJnLnN0YXJ0IiwgImcuZW5kIiwgImRpc3QiKQpjb2xuYW1lcyhzaG9ydF9pbnRyb25zLjNzcykgPC0gYygiaS5jaHJvbSIsICJpLnN0YXJ0IiwgImkuZW5kIiwgImkuaWQiLCAiaS5HQyIsICJpLnN0cmFuZCIsICJnLmNocm9tIiwgImcuc3RhcnQiLCAiZy5lbmQiLCAiZGlzdCIpCgpsb25nX2ludHJvbnMuYmVkIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL2xvbmdfaW50cm9ucy5zYW1lX0dDLmJlZCIpCnNob3J0X2ludHJvbnMuYmVkIDwtIGZyZWFkKCIuL0ludHJvbl9zaXplL0dDX2NvcnJlY3Rpb24vNTAwL3Nob3J0X2ludHJvbnMuc2FtZV9HQy5iZWQiKQpsb25nX3Nob3J0X2NvcnJlc3BvbmRlbmNlIDwtICBjYmluZChsb25nX2ludHJvbnMuYmVkLCBzaG9ydF9pbnRyb25zLmJlZClbICwgYyg0LCAyLCAzICwgNSwxMCwgOCwgOSwgMTEpXQoKY29sbmFtZXMobG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZSkgPC0gYygibC5pZCIsICJsLnN0YXJ0IiwgImwuZW5kIiwgImwuR0MiLCAicy5pZCIsICJzLnN0YXJ0IiwgInMuZW5kIiwgInMuR0MiICApCmxvbmdfc2hvcnRfY29ycmVzcG9uZGVuY2VbLCBzLmxlbjo9KHMuZW5kLXMuc3RhcnQpXQoKbG9uZ19zaG9ydF9jb3JyZXNwb25kZW5jZV8zNUsgPC0gaGVhZChsb25nX3Nob3J0X2NvcnJlc3BvbmRlbmNlLCAxNzUwMCkKCgoKCmxvbmdfaW50cm9ucy41c3NbLCBHNC41c3M6PUZBTFNFIF0KbG9uZ19pbnRyb25zLjVzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSIrIiAmIGkuc3RhcnQ8Zy5lbmQgLCBHNC41c3M6PVRSVUUgXQpsb25nX2ludHJvbnMuNXNzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09Ii0iICYgaS5zdGFydD5nLmVuZCAsIEc0LjVzczo9VFJVRSBdCgpzaG9ydF9pbnRyb25zLjVzc1ssIEc0LjVzczo9RkFMU0UgXQpzaG9ydF9pbnRyb25zLjVzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSIrIiAmIGkuc3RhcnQ8Zy5lbmQgLCBHNC41c3M6PVRSVUUgXQpzaG9ydF9pbnRyb25zLjVzc1sgZGlzdDw9MTAwICYgaS5zdHJhbmQ9PSItIiAmIGkuc3RhcnQ+Zy5lbmQgLCBHNC41c3M6PVRSVUUgXQoKbG9uZ19pbnRyb25zLjNzc1ssIEc0LjNzczo9RkFMU0UgXQpsb25nX2ludHJvbnMuM3NzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09IisiICYgaS5zdGFydDxnLmVuZCAsIEc0LjNzczo9VFJVRSBdCmxvbmdfaW50cm9ucy4zc3NbIGRpc3Q8PTEwMCAmIGkuc3RyYW5kPT0iLSIgJiBpLnN0YXJ0PmcuZW5kICwgRzQuM3NzOj1UUlVFIF0KCnNob3J0X2ludHJvbnMuM3NzWywgRzQuM3NzOj1GQUxTRSBdCnNob3J0X2ludHJvbnMuM3NzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09IisiICYgaS5zdGFydDxnLmVuZCAsIEc0LjNzczo9VFJVRSBdCnNob3J0X2ludHJvbnMuM3NzWyBkaXN0PD0xMDAgJiBpLnN0cmFuZD09Ii0iICYgaS5zdGFydD5nLmVuZCAsIEc0LjNzczo9VFJVRSBdCgoKbG9uZ19pbnRyb25zIDwtIG1lcmdlKCBsb25nX2ludHJvbnMuNXNzLCBsb25nX2ludHJvbnMuM3NzLCBieT1jKCJpLmlkIiwgImkuR0MiICkpCnNob3J0X2ludHJvbnMgPC0gbWVyZ2UoIHNob3J0X2ludHJvbnMuNXNzLCBzaG9ydF9pbnRyb25zLjNzcywgYnk9YygiaS5pZCIsICJpLkdDIiApKQoKCmxvbmdfaW50cm9uc1ssIEc0Oj1GQUxTRV0KbG9uZ19pbnRyb25zW0c0LjNzcyB8IEc0LjVzcyAsIEc0Oj1UUlVFXQpzaG9ydF9pbnRyb25zWywgRzQ6PUZBTFNFXQpzaG9ydF9pbnRyb25zW0c0LjNzcyB8IEc0LjVzcyAsIEc0Oj1UUlVFXQoKCgoKaS5taW5zIDwtIHNlcSg1MCw0NTAsNTApCmkubWF4cyA8LSBzZXEoMTAwLDUwMCw1MCkKCgoKaS5taW5zIDwtIHNlcSg1MCw0NTAsNTApCmkubWF4cyA8LSBzZXEoMTAwLDUwMCw1MCkKCgppLm1pbnMgPC0gc2VxKDAsNDAwLDEwMCkKaS5tYXhzIDwtIHNlcSgxMDAsNTAwLDEwMCkKCnNob3J0X2xvbmcub2RkX3JhdGlvcyA8LSBjKCkKc2hvcnRfbG9uZy5wdmFsdWVzPC0gYygpCnNob3J0X2xvbmcubG9uZy5mcmFxIDwtIGMoKQpzaG9ydF9sb25nLnNob3J0LmZyYXEgPC0gYygpCiAgCnNob3J0X2xvbmcuR0NzIDwtIGRhdGEudGFibGUoKQogIApmb3IgKGkgaW4gc2VxKDEsIGxlbmd0aChpLm1pbnMpKSkgewogICAgCiAgaS5taW4gPSBpLm1pbnNbaV0KICBpLm1heCA9IGkubWF4c1tpXQogICAgCiAgbG9uZ19pbnRyb25zLmludCA8LSBsb25nX2ludHJvbnNbaS5pZCAlaW4lIGxvbmdfc2hvcnRfY29ycmVzcG9uZGVuY2VfMzVLW3MubGVuPmkubWluICYgcy5sZW48PWkubWF4ICwgIGwuaWRdXQogIHNob3J0X2ludHJvbnMuaW50IDwtIHNob3J0X2ludHJvbnNbaS5pZCAlaW4lIGxvbmdfc2hvcnRfY29ycmVzcG9uZGVuY2VfMzVLW3MubGVuPmkubWluICYgcy5sZW48PWkubWF4LCBzLmlkXV0KICAKICAKICBsb25nX3Nob3J0LmludC4yeDIgPC0gbWF0cml4KG5yb3cgPSAyLCBjKG5yb3cobG9uZ19pbnRyb25zLmludFsoIUc0LjNzcyAmICFHNC41c3MpLCBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coc2hvcnRfaW50cm9ucy5pbnRbKCFHNC4zc3MgJiAhRzQuNXNzKSwgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93KGxvbmdfaW50cm9ucy5pbnRbKEc0LjNzcyB8IEc0LjVzcyksIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyhzaG9ydF9pbnRyb25zLmludFsoRzQuM3NzIHwgRzQuNXNzKSwgXSkgKSkKICAKICAKICBvZGQucmF0aW8gPC0gKGxvbmdfc2hvcnQuaW50LjJ4MlsyLDJdIC8gbG9uZ19zaG9ydC5pbnQuMngyWzIsMV0gKSAvIChsb25nX3Nob3J0LmludC4yeDJbMSwyXSAvIGxvbmdfc2hvcnQuaW50LjJ4MlsxLDFdKQogIGxvbmcuZnJhYyA8LSAgKGxvbmdfc2hvcnQuaW50LjJ4MlsxLDJdIC8gbG9uZ19zaG9ydC5pbnQuMngyWzEsMV0pCiAgc2hvcnQuZnJhYyA8LSAobG9uZ19zaG9ydC5pbnQuMngyWzIsMl0gLyBsb25nX3Nob3J0LmludC4yeDJbMiwxXSApCiAgCiAgcHJpbnQob2RkLnJhdGlvKQogIHByaW50KGNoaXNxLnRlc3QobG9uZ19zaG9ydC5pbnQuMngyKSkKICAKICBzaG9ydF9sb25nLm9kZF9yYXRpb3MgPC0gYyhzaG9ydF9sb25nLm9kZF9yYXRpb3MsIG9kZC5yYXRpbykKICBzaG9ydF9sb25nLnB2YWx1ZXMgPC0gYyhzaG9ydF9sb25nLnB2YWx1ZXMsIGNoaXNxLnRlc3QobG9uZ19zaG9ydC5pbnQuMngyKSRwLnZhbHVlICogbGVuZ3RoKGkubWlucykpCiAgc2hvcnRfbG9uZy5zaG9ydC5mcmFxICA8LSBjKHNob3J0X2xvbmcuc2hvcnQuZnJhcSwgc2hvcnQuZnJhYykKICBzaG9ydF9sb25nLmxvbmcuZnJhcSAgPC0gYyhzaG9ydF9sb25nLmxvbmcuZnJhcSwgbG9uZy5mcmFjKQogIAogIAogIHNob3J0X2xvbmcuR0NzIDwtIHJiaW5kKCBzaG9ydF9sb25nLkdDcywgc2hvcnRfaW50cm9ucy5pbnRbICwgLihpLmlkLCBpLkdDLCBHNCwgdHlwZT0iU2hvcnQiLCAgaS5taW49aS5taW4sIGkubWF4PWkubWF4ICldICkKICBzaG9ydF9sb25nLkdDcyA8LSByYmluZCggc2hvcnRfbG9uZy5HQ3MsIGxvbmdfaW50cm9ucy5pbnRbICwgLihpLmlkLCBpLkdDLCBHNCwgdHlwZT0iTG9uZyIsICBpLm1pbj1pLm1pbiwgaS5tYXg9aS5tYXggKV0gKSAgCiAgfQoKCgoKc2hvcnRfbG9uZy5yZXMgPC0gZGF0YS50YWJsZShzaG9ydF9sb25nLm9kZF9yYXRpb3MsIHNob3J0X2xvbmcucHZhbHVlcywgaS5taW5zLCBpLm1heHMsIHNob3J0X2xvbmcuc2hvcnQuZnJhcSwgc2hvcnRfbG9uZy5sb25nLmZyYXEpCgpzaG9ydF9sb25nLnJlcy5tZWx0IDwtIG1lbHQoc2hvcnRfbG9uZy5yZXMsIGlkPWMoInNob3J0X2xvbmcub2RkX3JhdGlvcyIsInNob3J0X2xvbmcucHZhbHVlcyIsICJpLm1pbnMiLCAiaS5tYXhzIikpCgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApgYGAKCgoKYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD01fQoKCgpzaG9ydF9sb25nLkdDcyR0eXBlIDwtIGZhY3RvcihzaG9ydF9sb25nLkdDcyR0eXBlLCBsZXZlbHM9YygiU2hvcnQiLCAiTG9uZyIpKQoKZ2dwbG90KHNob3J0X2xvbmcuR0NzKSArCiAgZ2VvbV92aW9saW4oYWVzKGFzLmZhY3RvcihpLm1pbiksIGkuR0MsIGZpbGw9dHlwZSkpICsKICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAnQmx1ZXMnKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKYGBgCgoKCgoKYGBge3J9CgoKCnNob3J0X2xvbmcucmVzLm1lbHRbLCBzaWc6PSIiXQpzaG9ydF9sb25nLnJlcy5tZWx0W3Nob3J0X2xvbmcucHZhbHVlcyA8PSAwLjA1ICwgc2lnOj0iKiJdCnNob3J0X2xvbmcucmVzLm1lbHRbc2hvcnRfbG9uZy5wdmFsdWVzIDw9IDAuMDA1ICwgc2lnOj0iKioiXQpzaG9ydF9sb25nLnJlcy5tZWx0W3Nob3J0X2xvbmcucHZhbHVlcyA8PSAwLjAwMCAsIHNpZzo9IioqKiJdCgpzaWdfcm93cyA8LSBzaG9ydF9sb25nLnJlcy5tZWx0W3ZhcmlhYmxlPT0ic2hvcnRfbG9uZy5zaG9ydC5mcmFxIiAmIHNpZyE9IiIsIHdoaWNoID0gVFJVRV0Kc2lnX2Fubm8gPC0gc2hvcnRfbG9uZy5yZXMubWVsdFt2YXJpYWJsZT09InNob3J0X2xvbmcuc2hvcnQuZnJhcSIgJiBzaWchPSIiLCBzaWddCgpGaWczLkMubmV3IDwtICBnZ3Bsb3Qoc2hvcnRfbG9uZy5yZXMubWVsdCwgYWVzKGFzLmZhY3RvcihpLm1pbnMpLCB2YWx1ZSkpICsKICBnZW9tX2JhcihhZXMoIGdyb3VwPXZhcmlhYmxlLCBmaWxsPXZhcmlhYmxlKSwgcG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV9zaWduaWYoIHlfcG9zaXRpb249MC4zLCB4bWluPXNpZ19yb3dzLTAuMTUsIHhtYXg9c2lnX3Jvd3MrMC4xNSwgYW5ub3RhdGlvbj1zaWdfYW5ubywgdGlwX2xlbmd0aD0wKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIkludHJvbiB0eXBlIiwgbGFiZWxzID0gYygiU2hvcnQiLCAiTG9uZyIpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICdCbHVlcycpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKRmlnMy5DLm5ldwoKYGBgCgoKCgoKCgoKIyMgRXhvbiBudW1iZXIKCgpIZXJlIHdlIGV4cGxvcmVkIGhvdyBHNCBlbnJpY2htZW50cyBjaGFuZ2UgdGhvcnVnaCBnZW5lIGJvZHkKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfMS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfMV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfMV9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zXzFfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfMV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMS5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18xLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc18xLnVwX3BsdXMsIGV4b25zXzEudXBfbWludXMsIGV4b25zXzEuZG93bl9wbHVzLCBleG9uc18xLmRvd25fbWludXMpIAoKYGBgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc18yLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc18yX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc18yX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfMl9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc18yX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc18yLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzIuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzIudXBfcGx1cywgZXhvbnNfMi51cF9taW51cywgZXhvbnNfMi5kb3duX3BsdXMsIGV4b25zXzIuZG93bl9taW51cykgCgpgYGAKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgoKZXhvbnNfMy51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfM19wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfM19wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zXzNfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfM19taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMy5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18zLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc18zLnVwX3BsdXMsIGV4b25zXzMudXBfbWludXMsIGV4b25zXzMuZG93bl9wbHVzLCBleG9uc18zLmRvd25fbWludXMpIAoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCgpleG9uc180LnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc180X3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc180X3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfNF9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc180X21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfNC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc180LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzQuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzQudXBfcGx1cywgZXhvbnNfNC51cF9taW51cywgZXhvbnNfNC5kb3duX3BsdXMsIGV4b25zXzQuZG93bl9taW51cykgCgpgYGAKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCgpleG9uc19taWRkbGUudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pZGRsZV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc19taWRkbGVfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pZGRsZV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pZGRsZV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taWRkbGUuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWlkZGxlLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc19taWRkbGUudXBfcGx1cywgZXhvbnNfbWlkZGxlLnVwX21pbnVzLCBleG9uc19taWRkbGUuZG93bl9wbHVzLCBleG9uc19taWRkbGUuZG93bl9taW51cykgCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKCmV4b25zX21pbnVzNC51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzNF9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzNC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czQuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzNC51cF9wbHVzLCBleG9uc19taW51czQudXBfbWludXMsIGV4b25zX21pbnVzNC5kb3duX3BsdXMsIGV4b25zX21pbnVzNC5kb3duX21pbnVzKSAKCmBgYAoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCgpleG9uc19taW51czMudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzM19wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc19taW51czNfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzM19taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czMuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzM19taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czMuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMzLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czMudXBfcGx1cywgZXhvbnNfbWludXMzLnVwX21pbnVzLCBleG9uc19taW51czMuZG93bl9wbHVzLCBleG9uc19taW51czMuZG93bl9taW51cykgCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKCmV4b25zX21pbnVzMi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXMyX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMl9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXMyX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvZXhvbnNfbWludXMyX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzMi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czIuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzMi51cF9wbHVzLCBleG9uc19taW51czIudXBfbWludXMsIGV4b25zX21pbnVzMi5kb3duX3BsdXMsIGV4b25zX21pbnVzMi5kb3duX21pbnVzKSAKCmBgYAoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCgpleG9uc19taW51czEudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9leG9uc19taW51czFfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czEuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMxLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czEudXBfcGx1cywgZXhvbnNfbWludXMxLnVwX21pbnVzLCBleG9uc19taW51czEuZG93bl9wbHVzLCBleG9uc19taW51czEuZG93bl9taW51cykgCgpgYGAKCgoKCgpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTE1fQpleG9uc18xLlRPVEFMWywgZXhvbl9udW06PSIxIl0KZXhvbnNfMi5UT1RBTFssIGV4b25fbnVtOj0iMiJdCmV4b25zXzMuVE9UQUxbLCBleG9uX251bTo9IjMiXQpleG9uc180LlRPVEFMWywgZXhvbl9udW06PSI0Il0KCmV4b25zX21pZGRsZS5UT1RBTFssIGV4b25fbnVtOj0ibWlkZGxlIl0KCmV4b25zX21pbnVzNC5UT1RBTFssIGV4b25fbnVtOj0iLTQiXQpleG9uc19taW51czMuVE9UQUxbLCBleG9uX251bTo9Ii0zIl0KZXhvbnNfbWludXMyLlRPVEFMWywgZXhvbl9udW06PSItMiJdCmV4b25zX21pbnVzMS5UT1RBTFssIGV4b25fbnVtOj0iLTEiXQoKCmV4b25fbnVtLlRPVEFMIDwtIHJiaW5kKGV4b25zXzEuVE9UQUwsIGV4b25zXzIuVE9UQUwsIGV4b25zXzMuVE9UQUwsIGV4b25zXzQuVE9UQUwsIGV4b25zX21pZGRsZS5UT1RBTCwgZXhvbnNfbWludXM0LlRPVEFMLCBleG9uc19taW51czMuVE9UQUwsIGV4b25zX21pbnVzMi5UT1RBTCwgZXhvbnNfbWludXMxLlRPVEFMKQoKCmV4b25fbnVtLlRPVEFMJGV4b25fbnVtIDwtIGZhY3RvcihleG9uX251bS5UT1RBTCRleG9uX251bSwgbGV2ZWxzID0gYygiMSIsICIyIiwgIjMiLCAiNCIsICJtaWRkbGUiLCAiLTQiLCAiLTMiLCAiLTIiLCAiLTEiICkpCgpnZ3Bsb3QoZXhvbl9udW0uVE9UQUwpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICB4bGltKGMoLTMwMCwzMDApKSArCiAgICBmYWNldF9ncmlkKCBleG9uX3BvcyB+IGV4b25fbnVtICAgKSArCiAgdGhlbWVfYncoKQoKYGBgCgoKCgoKIyMgRXhvbiBudW1iZXJzIGJ5IHN0cmF0bmRzICMjCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc18xLnVwX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzFfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEuZG93bl9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18xX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzEudXBfbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzFfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS5kb3duX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18xX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS51cF9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc18xLmRvd25fbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzEuVE9UQUwubnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzEudXBfcGx1cy5udCwgZXhvbnNfMS51cF9taW51cy5udCwgZXhvbnNfMS5kb3duX3BsdXMubnQsIGV4b25zXzEuZG93bl9taW51cy5udCkgCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfMS51cF9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzFfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18xLmRvd25fcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18xX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18xLnVwX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzFfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18xLmRvd25fbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS51cF9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zXzEuZG93bl9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18xLlRPVEFMLnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzEudXBfcGx1cy50LCBleG9uc18xLnVwX21pbnVzLnQsIGV4b25zXzEuZG93bl9wbHVzLnQsIGV4b25zXzEuZG93bl9taW51cy50KSAKCgogZ2dwbG90KGV4b25zXzEuVE9UQUwudCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICAgIHlsaW0oYygwLDYpKSArCiAgICB0aGVtZV9idygpCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfMi51cF9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18yX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLmRvd25fcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMl9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18yLnVwX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18yX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzIuZG93bl9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMl9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzIudXBfbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMi5kb3duX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18yLlRPVEFMLm50IDwtIHBsb3RfZGVuc2l0eShleG9uc18yLnVwX3BsdXMubnQsIGV4b25zXzIudXBfbWludXMubnQsIGV4b25zXzIuZG93bl9wbHVzLm50LCBleG9uc18yLmRvd25fbWludXMubnQpIAoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zXzIudXBfcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18yX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi5kb3duX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfMl9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi51cF9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18yX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi5kb3duX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzJfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzIudXBfbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc18yLmRvd25fbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfMi5UT1RBTC50IDwtIHBsb3RfZGVuc2l0eShleG9uc18yLnVwX3BsdXMudCwgZXhvbnNfMi51cF9taW51cy50LCBleG9uc18yLmRvd25fcGx1cy50LCBleG9uc18yLmRvd25fbWludXMudCkgCgoKIGdncGxvdChleG9uc18yLlRPVEFMLnQpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgICB5bGltKGMoMCw2KSkgKwogICAgdGhlbWVfYncoKQoKYGBgCgoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc18zLnVwX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzNfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMuZG93bl9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18zX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMudXBfbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzNfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy5kb3duX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18zX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy51cF9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc18zLmRvd25fbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzMuVE9UQUwubnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzMudXBfcGx1cy5udCwgZXhvbnNfMy51cF9taW51cy5udCwgZXhvbnNfMy5kb3duX3BsdXMubnQsIGV4b25zXzMuZG93bl9taW51cy5udCkgCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfMy51cF9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzNfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18zLmRvd25fcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc18zX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18zLnVwX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzNfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18zLmRvd25fbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfM19taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy51cF9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zXzMuZG93bl9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18zLlRPVEFMLnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzMudXBfcGx1cy50LCBleG9uc18zLnVwX21pbnVzLnQsIGV4b25zXzMuZG93bl9wbHVzLnQsIGV4b25zXzMuZG93bl9taW51cy50KSAKCgogZ2dwbG90KGV4b25zXzMuVE9UQUwudCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICAgIHlsaW0oYygwLDYpKSArCiAgICB0aGVtZV9idygpCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfNC51cF9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc180X3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LmRvd25fcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfNF9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LnVwX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc180X21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQuZG93bl9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfNF9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQudXBfbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfNC5kb3duX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc180LlRPVEFMLm50IDwtIHBsb3RfZGVuc2l0eShleG9uc180LnVwX3BsdXMubnQsIGV4b25zXzQudXBfbWludXMubnQsIGV4b25zXzQuZG93bl9wbHVzLm50LCBleG9uc180LmRvd25fbWludXMubnQpIAoKYGBgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc180LnVwX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfNF9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQuZG93bl9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zXzRfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQudXBfbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfNF9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQuZG93bl9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc180X21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LnVwX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfNC5kb3duX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzQuVE9UQUwudCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfNC51cF9wbHVzLnQsIGV4b25zXzQudXBfbWludXMudCwgZXhvbnNfNC5kb3duX3BsdXMudCwgZXhvbnNfNC5kb3duX21pbnVzLnQpIAoKCiBnZ3Bsb3QoZXhvbnNfNC5UT1RBTC50KSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgeWxpbShjKDAsNikpICsKICAgIHRoZW1lX2J3KCkKCmBgYAoKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zX21pZGRsZS51cF9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taWRkbGVfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS5kb3duX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pZGRsZV9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUudXBfbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pZGRsZV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUuZG93bl9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWlkZGxlX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWlkZGxlLnVwX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pZGRsZS5kb3duX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taWRkbGUuVE9UQUwubnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pZGRsZS51cF9wbHVzLm50LCBleG9uc19taWRkbGUudXBfbWludXMubnQsIGV4b25zX21pZGRsZS5kb3duX3BsdXMubnQsIGV4b25zX21pZGRsZS5kb3duX21pbnVzLm50KSAKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc19taWRkbGUudXBfcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taWRkbGVfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUuZG93bl9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pZGRsZV9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWlkZGxlLnVwX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pZGRsZV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pZGRsZS5kb3duX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pZGRsZV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWlkZGxlLnVwX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfbWlkZGxlLmRvd25fbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWlkZGxlLlRPVEFMLnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pZGRsZS51cF9wbHVzLnQsIGV4b25zX21pZGRsZS51cF9taW51cy50LCBleG9uc19taWRkbGUuZG93bl9wbHVzLnQsIGV4b25zX21pZGRsZS5kb3duX21pbnVzLnQpIAoKCiBnZ3Bsb3QoZXhvbnNfbWlkZGxlLlRPVEFMLnQpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgICB5bGltKGMoMCw2KSkgKwogICAgdGhlbWVfYncoKQoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zX21pbnVzNC51cF9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czRfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC5kb3duX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzNF9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czQudXBfbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzNF9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czQuZG93bl9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXM0X21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzNC5kb3duX21pbnVzLm50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czQuVE9UQUwubnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzNC51cF9wbHVzLm50LCBleG9uc19taW51czQudXBfbWludXMubnQsIGV4b25zX21pbnVzNC5kb3duX3BsdXMubnQsIGV4b25zX21pbnVzNC5kb3duX21pbnVzLm50KSAKCmBgYAoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfbWludXM0LnVwX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXM0X3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LmRvd25fcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czRfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC51cF9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czRfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czQuZG93bl9taW51cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czRfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC51cF9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzNC5kb3duX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zX21pbnVzNC5UT1RBTC50IDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czQudXBfcGx1cy50LCBleG9uc19taW51czQudXBfbWludXMudCwgZXhvbnNfbWludXM0LmRvd25fcGx1cy50LCBleG9uc19taW51czQuZG93bl9taW51cy50KSAKCgogZ2dwbG90KGV4b25zX21pbnVzNC5UT1RBTC50KSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50KSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogICAgeWxpbShjKDAsNikpICsKICAgIHRoZW1lX2J3KCkKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc19taW51czMudXBfcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMzX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czMuZG93bl9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czNfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMzLnVwX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czNfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMzLmRvd25fbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzM19taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy51cF9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czMuZG93bl9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMzLlRPVEFMLm50IDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czMudXBfcGx1cy5udCwgZXhvbnNfbWludXMzLnVwX21pbnVzLm50LCBleG9uc19taW51czMuZG93bl9wbHVzLm50LCBleG9uc19taW51czMuZG93bl9taW51cy5udCkgCgpgYGAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zX21pbnVzMy51cF9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzM19wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy5kb3duX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMzX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czMudXBfbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMzX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMzLmRvd25fbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMzX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czMudXBfbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czMuZG93bl9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czMuVE9UQUwudCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfbWludXMzLnVwX3BsdXMudCwgZXhvbnNfbWludXMzLnVwX21pbnVzLnQsIGV4b25zX21pbnVzMy5kb3duX3BsdXMudCwgZXhvbnNfbWludXMzLmRvd25fbWludXMudCkgCgoKIGdncGxvdChleG9uc19taW51czMuVE9UQUwudCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICAgIHlsaW0oYygwLDYpKSArCiAgICB0aGVtZV9idygpCgpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKZXhvbnNfbWludXMyLnVwX3BsdXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMl9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLmRvd25fcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMyX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi51cF9taW51cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMyX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi5kb3duX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czJfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czIudXBfbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfbWludXMyLmRvd25fbWludXMubnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zX21pbnVzMi5UT1RBTC5udCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfbWludXMyLnVwX3BsdXMubnQsIGV4b25zX21pbnVzMi51cF9taW51cy5udCwgZXhvbnNfbWludXMyLmRvd25fcGx1cy5udCwgZXhvbnNfbWludXMyLmRvd25fbWludXMubnQpIAoKYGBgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc19taW51czIudXBfcGx1cy50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czJfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czIuZG93bl9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMl9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLnVwX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMl9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0X3BsdXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi5kb3duX21pbnVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMl9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMyLnVwX21pbnVzLnRbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfbWludXMyLmRvd25fbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMyLlRPVEFMLnQgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzMi51cF9wbHVzLnQsIGV4b25zX21pbnVzMi51cF9taW51cy50LCBleG9uc19taW51czIuZG93bl9wbHVzLnQsIGV4b25zX21pbnVzMi5kb3duX21pbnVzLnQpIAoKCiBnZ3Bsb3QoZXhvbnNfbWludXMyLlRPVEFMLnQpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgICB5bGltKGMoMCw2KSkgKwogICAgdGhlbWVfYncoKQoKYGBgCgoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpleG9uc19taW51czEudXBfcGx1cy5udCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMxX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEuZG93bl9wbHVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czFfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMxLnVwX21pbnVzLm50IDwtIHJlYWRfZGlzdF90YWJsZSgiLi9leG9uX251bWJlcnMvc3RyYW5kcy9leG9uc19taW51czFfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNF9taW51cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMxLmRvd25fbWludXMubnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czEuZG93bl9taW51cy5udFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMxLlRPVEFMLm50IDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czEudXBfcGx1cy5udCwgZXhvbnNfbWludXMxLnVwX21pbnVzLm50LCBleG9uc19taW51czEuZG93bl9wbHVzLm50LCBleG9uc19taW51czEuZG93bl9taW51cy5udCkgCgpgYGAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmV4b25zX21pbnVzMS51cF9wbHVzLnQgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL2V4b25fbnVtYmVycy9zdHJhbmRzL2V4b25zX21pbnVzMV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfbWludXMuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS5kb3duX3BsdXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMxX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0X21pbnVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEudXBfbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMxX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzRfcGx1cy5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMxLmRvd25fbWludXMudCA8LSByZWFkX2Rpc3RfdGFibGUoIi4vZXhvbl9udW1iZXJzL3N0cmFuZHMvZXhvbnNfbWludXMxX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNF9wbHVzLmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEudXBfbWludXMudFssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czEuZG93bl9taW51cy50WyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czEuVE9UQUwudCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfbWludXMxLnVwX3BsdXMudCwgZXhvbnNfbWludXMxLnVwX21pbnVzLnQsIGV4b25zX21pbnVzMS5kb3duX3BsdXMudCwgZXhvbnNfbWludXMxLmRvd25fbWludXMudCkgCgoKIGdncGxvdChleG9uc19taW51czEuVE9UQUwudCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICAgIHlsaW0oYygwLDYpKSArCiAgICB0aGVtZV9idygpCgpgYGAKCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTV9CmV4b25zXzEuVE9UQUwubnRbLCBleG9uX251bTo9IjEiXQpleG9uc18yLlRPVEFMLm50WywgZXhvbl9udW06PSIyIl0KZXhvbnNfMy5UT1RBTC5udFssIGV4b25fbnVtOj0iMyJdCmV4b25zXzQuVE9UQUwubnRbLCBleG9uX251bTo9IjQiXQoKZXhvbnNfbWlkZGxlLlRPVEFMLm50WywgZXhvbl9udW06PSJtaWRkbGUiXQoKZXhvbnNfbWludXM0LlRPVEFMLm50WywgZXhvbl9udW06PSItNCJdCmV4b25zX21pbnVzMy5UT1RBTC5udFssIGV4b25fbnVtOj0iLTMiXQpleG9uc19taW51czIuVE9UQUwubnRbLCBleG9uX251bTo9Ii0yIl0KZXhvbnNfbWludXMxLlRPVEFMLm50WywgZXhvbl9udW06PSItMSJdCgoKZXhvbl9udW0uVE9UQUwubnQgPC0gcmJpbmQoZXhvbnNfMS5UT1RBTC5udCwgZXhvbnNfMi5UT1RBTC5udCwgZXhvbnNfMy5UT1RBTC5udCwgZXhvbnNfNC5UT1RBTC5udCwgZXhvbnNfbWlkZGxlLlRPVEFMLm50LCBleG9uc19taW51czQuVE9UQUwubnQsIGV4b25zX21pbnVzMy5UT1RBTC5udCwgZXhvbnNfbWludXMyLlRPVEFMLm50LCBleG9uc19taW51czEuVE9UQUwubnQpCgoKCgpleG9uc18xLlRPVEFMLnRbLCBleG9uX251bTo9IjEiXQpleG9uc18yLlRPVEFMLnRbLCBleG9uX251bTo9IjIiXQpleG9uc18zLlRPVEFMLnRbLCBleG9uX251bTo9IjMiXQpleG9uc180LlRPVEFMLnRbLCBleG9uX251bTo9IjQiXQoKZXhvbnNfbWlkZGxlLlRPVEFMLnRbLCBleG9uX251bTo9Im1pZGRsZSJdCgpleG9uc19taW51czQuVE9UQUwudFssIGV4b25fbnVtOj0iLTQiXQpleG9uc19taW51czMuVE9UQUwudFssIGV4b25fbnVtOj0iLTMiXQpleG9uc19taW51czIuVE9UQUwudFssIGV4b25fbnVtOj0iLTIiXQpleG9uc19taW51czEuVE9UQUwudFssIGV4b25fbnVtOj0iLTEiXQoKCgoKCmV4b25fbnVtLlRPVEFMLnQgPC0gcmJpbmQoZXhvbnNfMS5UT1RBTC50LCBleG9uc18yLlRPVEFMLnQsIGV4b25zXzMuVE9UQUwudCwgZXhvbnNfNC5UT1RBTC50LCBleG9uc19taWRkbGUuVE9UQUwudCwgZXhvbnNfbWludXM0LlRPVEFMLnQsIGV4b25zX21pbnVzMy5UT1RBTC50LCBleG9uc19taW51czIuVE9UQUwudCwgZXhvbnNfbWludXMxLlRPVEFMLnQpCgoKZXhvbl9udW0uVE9UQUwubnRbLCBzdHJhbmQ6PSJOb25fdGVtcGxhdGUiXQpleG9uX251bS5UT1RBTC50Wywgc3RyYW5kOj0iVGVtcGxhdGUiXQoKCmV4b25fbnVtLlRPVEFMLnRudCA8LSByYmluZChleG9uX251bS5UT1RBTC5udCwgZXhvbl9udW0uVE9UQUwudCkKZXhvbl9udW0uVE9UQUwudG50JGV4b25fbnVtIDwtIGZhY3RvcihleG9uX251bS5UT1RBTC50bnQkZXhvbl9udW0sIGxldmVscyA9IGMoIjEiLCAiMiIsICIzIiwgIjQiLCAibWlkZGxlIiwgIi00IiwgIi0zIiwgIi0yIiwgIi0xIiApKQoKCgpleG9uX251bS5UT1RBTC50bnRbZXhvbl9udW09PSJtaWRkbGUiLCBUb3RhbF9leG9uczo9KDQzOTI1ICsgNDM3MjkpIF0KZXhvbl9udW0uVE9UQUwudG50W2V4b25fbnVtIT0ibWlkZGxlIiwgVG90YWxfZXhvbnM6PSg0NzQ1ICsgNDU2OSkgXQoKCmV4b25fbnVtLlRPVEFMLnRudC5iaW5vbWlhbCA8LSBjYmluZChleG9uX251bS5UT1RBTC50bnQsICBleG9uX251bS5UT1RBTC50bnRbLCBiaW5jb25mKE9jY3VycmVuY2VzLCBUb3RhbF9leG9ucykgXSkKCgoKZXhvbl9udW0uVE9UQUwudG50LmJpbm9taWFsWywgbWVkaWFuOj1OVUxMXQoKZXhvbl9udW0uVE9UQUwudG50LmJpbm9taWFsWyAsIG1lZGlhbjo9bWVkaWFuKFBvaW50RXN0KSwgYnk9YygiZXhvbl9wb3MiLCAic3RyYW5kIiwgImV4b25fbnVtIiApXQpleG9uX251bS5UT1RBTC50bnQuYmlub21pYWxbLCBgOj1gKEVucnJpY2htZW50PVBvaW50RXN0L21lZGlhbiwgRW5ycmljaG1lbnRfbD1Mb3dlci9tZWRpYW4sIEVucnJpY2htZW50X3U9VXBwZXIvbWVkaWFuKV0KCgpGaWczLkQubmV3IDwtZ2dwbG90KGV4b25fbnVtLlRPVEFMLnRudC5iaW5vbWlhbCkrCiAgZ2VvbV9yaWJib24oYWVzKHg9UG9zaXRpb24sIGZpbGw9c3RyYW5kLCB5bWluPUVucnJpY2htZW50X2wsIHltYXg9RW5ycmljaG1lbnRfdSksIGFscGhhPTAuMykgKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1zdHJhbmQpKSArCiAgICB4bGltKGMoLTMwMCwzMDApKSArCiAgICBmYWNldF9ncmlkKCBleG9uX3BvcyB+IGV4b25fbnVtICAgKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCgpGaWczLkQubmV3CgoKYGBgCgoKCgojIEc0IHNlcQoKCkhlcmUgd2UgZGlzdHJpYnV0aW9uIG9mIEc0LXNlcSBleHBlcmltZW50cyAgCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpHNF8yMDE5LksuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkuSy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgpHNF8yMDE5LksuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS5LLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCkc0XzIwMTkuSy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE5LksuUTFfdXBfcGx1cywgRzRfMjAxOS5LLlEyX3VwX3BsdXMsIEc0XzIwMTkuSy5RM191cF9wbHVzLCBHNF8yMDE5LksuUTRfdXBfcGx1cykKRzRfMjAxOS5LLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE5LksuUTFfdXBfbWludXMsIEc0XzIwMTkuSy5RMl91cF9taW51cywgRzRfMjAxOS5LLlEzX3VwX21pbnVzLCBHNF8yMDE5LksuUTRfdXBfbWludXMpCkc0XzIwMTkuSy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkuSy5RMV9kb3duX3BsdXMsIEc0XzIwMTkuSy5RMl9kb3duX3BsdXMsIEc0XzIwMTkuSy5RM19kb3duX3BsdXMsIEc0XzIwMTkuSy5RNF9kb3duX3BsdXMpCkc0XzIwMTkuSy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5LksuUTFfZG93bl9taW51cywgRzRfMjAxOS5LLlEyX2Rvd25fbWludXMsIEc0XzIwMTkuSy5RM19kb3duX21pbnVzLCBHNF8yMDE5LksuUTRfZG93bl9taW51cykKRzRfMjAxOS5LLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE5LksuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTkuSy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTkuSy5Rcy5taW51cy5saXN0LCBHNF8yMDE5LksuUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTkuSy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTkuSy53aW5kb3dfbGVuKQoKCmdncGxvdChHNF8yMDE5LksuUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTIwMCwyMDApKSArCiAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpICsKICB0aGVtZV9idygpICsgCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCmBgYAoKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCkc0XzIwMTkuUERTLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkuUERTLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKRzRfMjAxOS5QRFMuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5LlBEUy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCkc0XzIwMTkuUERTLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTkuUERTLlExX3VwX3BsdXMsIEc0XzIwMTkuUERTLlEyX3VwX3BsdXMsIEc0XzIwMTkuUERTLlEzX3VwX3BsdXMsIEc0XzIwMTkuUERTLlE0X3VwX3BsdXMpCkc0XzIwMTkuUERTLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE5LlBEUy5RMV91cF9taW51cywgRzRfMjAxOS5QRFMuUTJfdXBfbWludXMsIEc0XzIwMTkuUERTLlEzX3VwX21pbnVzLCBHNF8yMDE5LlBEUy5RNF91cF9taW51cykKRzRfMjAxOS5QRFMuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5LlBEUy5RMV9kb3duX3BsdXMsIEc0XzIwMTkuUERTLlEyX2Rvd25fcGx1cywgRzRfMjAxOS5QRFMuUTNfZG93bl9wbHVzLCBHNF8yMDE5LlBEUy5RNF9kb3duX3BsdXMpCkc0XzIwMTkuUERTLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkuUERTLlExX2Rvd25fbWludXMsIEc0XzIwMTkuUERTLlEyX2Rvd25fbWludXMsIEc0XzIwMTkuUERTLlEzX2Rvd25fbWludXMsIEc0XzIwMTkuUERTLlE0X2Rvd25fbWludXMpCkc0XzIwMTkuUERTLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE5LlBEUy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxOS5QRFMuUXMucGx1cy51cC5saXN0LCBHNF8yMDE5LlBEUy5Rcy5taW51cy5saXN0LCBHNF8yMDE5LlBEUy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxOS5QRFMuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE5LlBEUy53aW5kb3dfbGVuKQoKCmdncGxvdChHNF8yMDE5LlBEUy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkgKyAKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCkc0XzIwMTkudGVtcGxhdGUuUERTLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgoKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgpgYGAKCgoKYGBge3J9Ckc0XzIwMTkudGVtcGxhdGUuUERTLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTkudGVtcGxhdGUuUERTLlExX3VwX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlEyX3VwX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlEzX3VwX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlE0X3VwX3BsdXMpCkc0XzIwMTkudGVtcGxhdGUuUERTLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMV91cF9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfdXBfbWludXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlEzX3VwX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5RNF91cF9taW51cykKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMV9kb3duX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlEyX2Rvd25fcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5RNF9kb3duX3BsdXMpCkc0XzIwMTkudGVtcGxhdGUuUERTLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkudGVtcGxhdGUuUERTLlExX2Rvd25fbWludXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlEyX2Rvd25fbWludXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlEzX2Rvd25fbWludXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlE0X2Rvd25fbWludXMpCkc0XzIwMTkudGVtcGxhdGUuUERTLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMucGx1cy51cC5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy5taW51cy5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLlBEUy53aW5kb3dfbGVuKQpgYGAKCgoKYGBge3J9Ckc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTFfdXBfcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX3VwX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RM191cF9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTRfdXBfcGx1cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTFfdXBfbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMl91cF9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTRfdXBfbWludXMpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV9kb3duX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMl9kb3duX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RM19kb3duX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF9kb3duX3BsdXMpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTFfZG93bl9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX2Rvd25fbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RM19kb3duX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTRfZG93bl9taW51cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy5taW51cy5saXN0LCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy53aW5kb3dfbGVuKQpgYGAKCgpgYGB7cn0KCgoKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsIDwtIHJiaW5kKEc0XzIwMTkudGVtcGxhdGUuUERTLlFzLnRvdGFsLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwpCiAgCmhhbGZfbiA8LSBucm93KEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCkvMgpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWxbLCBTdHJhbmQ6PXJlcChjKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiKSwgZWFjaD1oYWxmX24pIF0KICAKICAKICAKICAKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsJFN0cmFuZCA8LSAgZmFjdG9yKEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCRTdHJhbmQsIGxldmVscz1jKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiICkpCgogIApgYGAKCgoKCmBgYHtyfQoKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsJFEgPC0gbWFwdmFsdWVzKEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCRRLCAgZnJvbSA9YygxOjQpLCB0byA9YygiUTEiLCAiUTIiLCAiUTMiLCAiUTQiKSkKCgpnZ3Bsb3QoRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0xNTAsMTUwKSkgKwogIGZhY2V0X2dyaWQoIFN0cmFuZCB+IGV4b25fcG9zICkgKwogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWVfYncoKSAgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgoKYGBgCgoKCmBgYHtyfQpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWxbU3RyYW5kPT0iTm9uLXRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJUZW1wbGF0ZSJdCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbFtTdHJhbmQ9PSJUZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iTm9uLXRlbXBsYXRlIl0KCgogIApHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwkbmV3X1N0cmFuZCA8LSAgZmFjdG9yKEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCRuZXdfU3RyYW5kLCBsZXZlbHM9YygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiApKQoKZ2dwbG90KEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMTUwLDE1MCkpICsKICBmYWNldF9ncmlkKCBuZXdfU3RyYW5kIH4gZXhvbl9wb3MgKSArCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZV9idygpICArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKCgoKCgoKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCkc0XzIwMTkudGVtcGxhdGUuSy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkudGVtcGxhdGUuSy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCgpHNF8yMDE5LnRlbXBsYXRlLksuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS50ZW1wbGF0ZS5LLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKYGBgCgoKCmBgYHtyfQpHNF8yMDE5LnRlbXBsYXRlLksuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5LLlExX3VwX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RMl91cF9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTNfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X3VwX3BsdXMpCkc0XzIwMTkudGVtcGxhdGUuSy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5LLlExX3VwX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTJfdXBfbWludXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RM191cF9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X3VwX21pbnVzKQpHNF8yMDE5LnRlbXBsYXRlLksuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5LnRlbXBsYXRlLksuUTFfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTJfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTNfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTRfZG93bl9wbHVzKQpHNF8yMDE5LnRlbXBsYXRlLksuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5LLlExX2Rvd25fbWludXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RMl9kb3duX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTNfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X2Rvd25fbWludXMpCkc0XzIwMTkudGVtcGxhdGUuSy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxOS50ZW1wbGF0ZS5LLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE5LnRlbXBsYXRlLksuUXMucGx1cy51cC5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLksuUXMubWludXMubGlzdCwgRzRfMjAxOS50ZW1wbGF0ZS5LLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLksuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLksud2luZG93X2xlbikKYGBgCgoKCmBgYHtyfQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfdXBfcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMl91cF9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX3VwX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfdXBfcGx1cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV91cF9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMl91cF9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RM191cF9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF91cF9taW51cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfZG93bl9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RM19kb3duX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfZG93bl9wbHVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfZG93bl9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMl9kb3duX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX2Rvd25fbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfZG93bl9taW51cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUXMubWludXMubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksud2luZG93X2xlbikKYGBgCgoKYGBge3J9CgpHNF8yMDE5LnRlbXBsYXRlLksuUXMudG90YWwKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy50b3RhbAoKCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWwgPC0gcmJpbmQoRzRfMjAxOS50ZW1wbGF0ZS5LLlFzLnRvdGFsLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsKQogIApoYWxmX24gPC0gbnJvdyhHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsKS8yCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWxbLCBTdHJhbmQ6PXJlcChjKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiKSwgZWFjaD1oYWxmX24pIF0KICAKICAKICAKICAKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuSy5Rcy50b3RhbCRTdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJFN0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCiAgCmBgYAoKCgoKCgoKYGBge3J9CgoKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuSy5Rcy50b3RhbCRRIDwtIG1hcHZhbHVlcyhHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsW1N0cmFuZD09Ik5vbi10ZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iVGVtcGxhdGUiXQpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsW1N0cmFuZD09IlRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJOb24tdGVtcGxhdGUiXQoKCgpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJG5ld19TdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJG5ld19TdHJhbmQsIGxldmVscz1jKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiICkpCgpnZ3Bsb3QoRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuSy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMTUwLDE1MCkpICsKICBmYWNldF9ncmlkKCBuZXdfU3RyYW5kIH4gZXhvbl9wb3MgKSArCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZV9idygpICArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKCmBgYAoKCgoKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojMjAxNQoKRzRfMjAxNS5OYV9QRFMuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS5OYV9QRFMuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lk5hX1BEUy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS5OYV9QRFMuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKCgpHNF8yMDE1Lk5hX1BEUy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX1BEUy5RMV91cF9wbHVzLCBHNF8yMDE1Lk5hX1BEUy5RMl91cF9wbHVzLCBHNF8yMDE1Lk5hX1BEUy5RM191cF9wbHVzLCBHNF8yMDE1Lk5hX1BEUy5RNF91cF9wbHVzKQpHNF8yMDE1Lk5hX1BEUy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS5OYV9QRFMuUTFfdXBfbWludXMsIEc0XzIwMTUuTmFfUERTLlEyX3VwX21pbnVzLCBHNF8yMDE1Lk5hX1BEUy5RM191cF9taW51cywgRzRfMjAxNS5OYV9QRFMuUTRfdXBfbWludXMpCkc0XzIwMTUuTmFfUERTLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS5OYV9QRFMuUTFfZG93bl9wbHVzLCBHNF8yMDE1Lk5hX1BEUy5RMl9kb3duX3BsdXMsIEc0XzIwMTUuTmFfUERTLlEzX2Rvd25fcGx1cywgRzRfMjAxNS5OYV9QRFMuUTRfZG93bl9wbHVzKQpHNF8yMDE1Lk5hX1BEUy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX1BEUy5RMV9kb3duX21pbnVzLCBHNF8yMDE1Lk5hX1BEUy5RMl9kb3duX21pbnVzLCBHNF8yMDE1Lk5hX1BEUy5RM19kb3duX21pbnVzLCBHNF8yMDE1Lk5hX1BEUy5RNF9kb3duX21pbnVzKQpHNF8yMDE1Lk5hX1BEUy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS5OYV9QRFMuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTUuTmFfUERTLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxNS5OYV9QRFMuUXMubWludXMubGlzdCwgRzRfMjAxNS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTUuTmFfUERTLlFzLm1pbnVzLmRvd24ubGlzdCwgRzRfMjAxNS5OYV9QRFMud2luZG93X2xlbikKCgpnZ3Bsb3QoRzRfMjAxNS5OYV9QRFMuUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTIwMCwyMDApKSArCiAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpICsKICB0aGVtZV9idygpICsgCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCmBgYAoKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpHNF8yMDE1Lk5hX0suUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUuTmFfSy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lk5hX0suUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lk5hX0suUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCgoKRzRfMjAxNS5OYV9LLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTUuTmFfSy5RMV91cF9wbHVzLCBHNF8yMDE1Lk5hX0suUTJfdXBfcGx1cywgRzRfMjAxNS5OYV9LLlEzX3VwX3BsdXMsIEc0XzIwMTUuTmFfSy5RNF91cF9wbHVzKQpHNF8yMDE1Lk5hX0suUXMubWludXMubGlzdCA8LSBsaXN0KEc0XzIwMTUuTmFfSy5RMV91cF9taW51cywgRzRfMjAxNS5OYV9LLlEyX3VwX21pbnVzLCBHNF8yMDE1Lk5hX0suUTNfdXBfbWludXMsIEc0XzIwMTUuTmFfSy5RNF91cF9taW51cykKRzRfMjAxNS5OYV9LLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS5OYV9LLlExX2Rvd25fcGx1cywgRzRfMjAxNS5OYV9LLlEyX2Rvd25fcGx1cywgRzRfMjAxNS5OYV9LLlEzX2Rvd25fcGx1cywgRzRfMjAxNS5OYV9LLlE0X2Rvd25fcGx1cykKRzRfMjAxNS5OYV9LLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUuTmFfSy5RMV9kb3duX21pbnVzLCBHNF8yMDE1Lk5hX0suUTJfZG93bl9taW51cywgRzRfMjAxNS5OYV9LLlEzX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfSy5RNF9kb3duX21pbnVzKQpHNF8yMDE1Lk5hX0sud2luZG93X2xlbiA9IDIwMDAKCkc0XzIwMTUuTmFfSy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxNS5OYV9LLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxNS5OYV9LLlFzLm1pbnVzLmxpc3QsIEc0XzIwMTUuTmFfSy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxNS5OYV9LLlFzLm1pbnVzLmRvd24ubGlzdCwgRzRfMjAxNS5OYV9LLndpbmRvd19sZW4pCgoKZ2dwbG90KEc0XzIwMTUuTmFfSy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkgKyAKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKCgpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKYGBgCgoKCmBgYHtyfQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV91cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl91cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM191cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF91cF9wbHVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX3VwX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM191cF9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfbWludXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTFfZG93bl9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl9kb3duX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX2Rvd25fcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTRfZG93bl9wbHVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV9kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl9kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM19kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF9kb3duX21pbnVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLm1pbnVzLmRvd24ubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMud2luZG93X2xlbikKYGBgCgoKCmBgYHtyfQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlExX3VwX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl91cF9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfdXBfcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlE0X3VwX3BsdXMpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlExX3VwX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTJfdXBfbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM191cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlE0X3VwX21pbnVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTJfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfZG93bl9wbHVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlExX2Rvd25fbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl9kb3duX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlE0X2Rvd25fbWludXMpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy51cC5saXN0LCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMubGlzdCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMud2luZG93X2xlbikKYGBgCgoKYGBge3J9CgpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbApHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwKCgpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwgPC0gcmJpbmQoRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCkKICAKaGFsZl9uIDwtIG5yb3coRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsKS8yCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbFssIFN0cmFuZDo9cmVwKGMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIpLCBlYWNoPWhhbGZfbikgXQogIAogIAogIAogIApHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwkU3RyYW5kIDwtICBmYWN0b3IoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsJFN0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCiAgCmBgYAoKCgoKYGBge3J9CgoKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsJFEgPC0gbWFwdmFsdWVzKEc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCRRLCAgZnJvbSA9YygxOjQpLCB0byA9YygiUTEiLCAiUTIiLCAiUTMiLCAiUTQiKSkKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsW1N0cmFuZD09Ik5vbi10ZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iVGVtcGxhdGUiXQpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWxbU3RyYW5kPT0iVGVtcGxhdGUiICwgbmV3X1N0cmFuZDo9Ik5vbi10ZW1wbGF0ZSJdCgoKCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCRuZXdfU3RyYW5kIDwtICBmYWN0b3IoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsJG5ld19TdHJhbmQsIGxldmVscz1jKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiICkpCgpnZ3Bsb3QoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0zMDAsMzAwKSkgKwogIGZhY2V0X2dyaWQoIG5ld19TdHJhbmQgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKYGBgCgoKCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi4vRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiLi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIuL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKYGBgCgoKCmBgYHtyfQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlExX3VwX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMl91cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTNfdXBfcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlE0X3VwX3BsdXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlExX3VwX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTJfdXBfbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RM191cF9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlE0X3VwX21pbnVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTFfZG93bl9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTJfZG93bl9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTNfZG93bl9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTRfZG93bl9wbHVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlExX2Rvd25fbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMl9kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTNfZG93bl9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlE0X2Rvd25fbWludXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMucGx1cy51cC5saXN0LCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMubWludXMubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE1LnRlbXBsYXRlLk5hX0sud2luZG93X2xlbikKYGBgCgoKCmBgYHtyfQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfdXBfcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl91cF9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX3VwX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfdXBfcGx1cykKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV91cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl91cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RM191cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF91cF9taW51cykKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RM19kb3duX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfZG93bl9wbHVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfZG93bl9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl9kb3duX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfZG93bl9taW51cykKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUXMubWludXMubGlzdCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0sud2luZG93X2xlbikKYGBgCgoKYGBge3J9CgpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMudG90YWwKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbAoKCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwgPC0gcmJpbmQoRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsKQogIApoYWxmX24gPC0gbnJvdyhHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsKS8yCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWxbLCBTdHJhbmQ6PXJlcChjKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiKSwgZWFjaD1oYWxmX24pIF0KICAKICAKICAKICAKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCRTdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsJFN0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCiAgCmBgYAoKCgoKYGBge3J9CgoKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCRRIDwtIG1hcHZhbHVlcyhHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsW1N0cmFuZD09Ik5vbi10ZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iVGVtcGxhdGUiXQpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsW1N0cmFuZD09IlRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJOb24tdGVtcGxhdGUiXQoKCgpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsJG5ld19TdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsJG5ld19TdHJhbmQsIGxldmVscz1jKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiICkpCgpnZ3Bsb3QoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMzAwLDMwMCkpICsKICBmYWNldF9ncmlkKCBuZXdfU3RyYW5kIH4gZXhvbl9wb3MgKSArCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZV9idygpICArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKCmBgYAoKCgoKIyBLQ2wgUk5BLXNlcQoKCkFzIEsrIGlzIGtub3duIHRvIHN0YWJpbGl6ZSBHNCwgd2UgYW5hbGl6ZWQgKFJOQS1zZXEgZGF0YSlbaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9iaW9wcm9qZWN0L1BSSkVCMTk0NTFdIGNvbW1pbmcgZnJvbSBuZXVyb25zIGFmdGVyIDQtaG91ciBLQ2wtaW5kdXNlZCBkZXBvbGFyaXphdGlvbi4gCgoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpLQ0xfaHVtYW5fdXBzdHJlYW0gPC0gZnJlYWQoIi4uL0tDTC9NaWNyb0V4b25hdG9yL0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW1fMTAwbnQuRzRzIiAgKSAjc3RvcCBoZXJlCmNvbG5hbWVzKEtDTF9odW1hbl91cHN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIgICkKCgpLQ0xfaHVtYW5fZG93bnN0cmVhbTwtIGZyZWFkKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9Db250cm9sX3ZzX0tDTC5kaWZmLmRvd25zdHJlYW1fMTAwbnQuRzRzIiAgKQpjb2xuYW1lcyhLQ0xfaHVtYW5fZG93bnN0cmVhbSkgPC1jKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IiAgKQoKCktDTF9odW1hbiA8LSAgbWVyZ2UoS0NMX2h1bWFuX3Vwc3RyZWFtWywgYygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX2h1bWFuX2Rvd25zdHJlYW1bLCBjKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IikgXSwgCiAgICAgICAgICAgICAgICAgICAgYnk9YygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIpICkKCktDTF9odW1hblsoRzQueD4wIHwgRzQueT4wICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX2h1bWFuWyhHNC54PT0wICYgRzQueT09MCApLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCktDTF9odW1hbiRHNF9ib2wgPC0gZmFjdG9yKEtDTF9odW1hbiRHNF9ib2wsIGxldmVscz1jKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpICkKCgpLQ0xfaHVtYW5bZW5kIC0gc3RhcnQgPiAzMCwgZXhvbjo9ImV4b24iIF0KS0NMX2h1bWFuW2VuZCAtIHN0YXJ0IDw9IDMwLCBleG9uOj0ibWljcm9leG9uIiBdCgpzaXplLnZhcj0wLjUKYWxwaGEudmFyPTAuMjUKCiBnZ3Bsb3QoZGF0YT1LQ0xfaHVtYW5bIFR5cGU9PSJDRSIsXSkgKwogIGdlb21fcG9pbnQoIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksIGNvbG91cj0iZ3JleSIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5bVHlwZT09IkNFIiAmIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJza3libHVlIiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5bVHlwZT09IkNFIiAmIERlbHRhUHNpPCgtMC4xKSAmIFByb2JhYmlsaXR5PjAuOSwgXSwgYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJyZWQiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICB4bGltKGMoLTAuOCwgMC44KSkgKwogIGZhY2V0X2dyaWQoIC4gfiBHNF9ib2wgICkgKwogIHhsYWIoIkRlbHRhUFNJIChDb250cm9sIC0gS0NsKSIpICsKICB0aGVtZV9idygpCgoKCgpgYGAKCgpUbyBoaWdobGlnaHQgTlJYTjIsIFNIQU5LMSBhbmQgUkJNMTAgd2UgdXNlZCBiaW9tYVJ0IHRvIGZpbmQgdGhlIGdlbmUgbmFtZSB0byBFbnNlbWJsIElEIGNvcnJlc3BvbmRlbmNlIAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShiaW9tYVJ0KQoKZW5zZW1ibCA9IHVzZUVuc2VtYmwoYmlvbWFydD0iZW5zZW1ibCIsIGRhdGFzZXQ9ImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIpCgoKS0NMX2h1bWFuWyBUeXBlPT0iQ0UiJiBEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT4wLjksICBdCgoKS0NMX2h1bWFuWywgQ29vcmRzOj1wYXN0ZShjaHJvbSwgcGFzdGUoc3RhcnQsIGVuZCwgc2VwID0gIi0iKSwgc3RyYW5kLCBzZXA9IjoiICldCgoKd2hpcHBldC5qbHMuZXhvbnMuaGcxOSA8LSAgZnJlYWQoIi4uL0tDTC93aGlwcGV0Lmpscy5leG9ucy50YWIiKQoKS0NMX2h1bWFuX0NFIDwtIG1lcmdlKEtDTF9odW1hbltUeXBlPT0iQ0UiLCBdLCB3aGlwcGV0Lmpscy5leG9ucy5oZzE5LCBieS54PSJDb29yZHMiLCBieS55PSJQb3RlbnRpYWxfRXhvbiIpCgoKS0NMX2h1bWFuX0NFWyAsIGVuc2VtYmxfZ2VuZV9pZDo9dmFwcGx5KHN0cnNwbGl0KEtDTF9odW1hbl9DRSRHZW5lLCAiLiIsIGZpeGVkID0gVFJVRSksICJbIiwgIiIsIDEpXQoKS0NMX2h1bWFuX0NFX2dlbmVzIDwtICBkYXRhLnRhYmxlKGdldEJNKGF0dHJpYnV0ZXM9YygnZW5zZW1ibF9nZW5lX2lkJywgIndpa2lnZW5lX2Rlc2NyaXB0aW9uIiwgImhnbmNfc3ltYm9sIiksZmlsdGVycyA9ICdlbnNlbWJsX2dlbmVfaWQnLCB2YWx1ZXMgPSB1bmlxdWUodmFwcGx5KHN0cnNwbGl0KEtDTF9odW1hbl9DRSRHZW5lLCAiLiIsIGZpeGVkID0gVFJVRSksICJbIiwgIiIsIDEpKSAsIG1hcnQgPSBlbnNlbWJsKSkKCgpLQ0xfaHVtYW5fQ0UgPC0gIG1lcmdlKEtDTF9odW1hbl9DRSwgS0NMX2h1bWFuX0NFX2dlbmVzLCBieT0iZW5zZW1ibF9nZW5lX2lkIikKCgoKCgoKCgoKCgpLQ0xfaHVtYW5fQ0VbIGhnbmNfc3ltYm9sPT0iR1JJTjEiLCAgXVsgVHlwZT09IkNFIiYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC44NSwgIF0KCktDTF9odW1hbl9DRVsgaGduY19zeW1ib2w9PSJOUlhOMiIsICBdWyBUeXBlPT0iQ0UiJiBEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT4wLjksICBdCktDTF9odW1hbl9DRVsgaGduY19zeW1ib2w9PSJTSEFOSzEiLCAgXVsgVHlwZT09IkNFIiYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC44NSwgIF0KS0NMX2h1bWFuX0NFWyBoZ25jX3N5bWJvbD09IlJCTTEwIiwgIF1bIFR5cGU9PSJDRSImIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgIF0KCgoKCgogIAoKCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD00fQpsaWJyYXJ5KCJnZ3JlcGVsIikKCnZhbGlkYXRpb25fZXhvbnMgPC1jKCJjaHIxOjExMDczNDU5NC0xMTA3MzQ4MzU6KyIsICJjaHIxOToxNzczMTUwMi0xNzczMTUzMTotIiwgImNocjExOjIwMDcyODM1LTIwMDcyODc5OisiKQoKRmlnNS5BIDwtIGdncGxvdChkYXRhPUtDTF9odW1hblsgVHlwZT09IkNFIixdKSArCiAgZ2VvbV9wb2ludCggYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJncmV5IiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbltUeXBlPT0iQ0UiICYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InNreWJsdWUiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbltUeXBlPT0iQ0UiICYgRGVsdGFQc2k8KC0wLjEpICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InJlZCIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogIHhsaW0oYygtMC44LCAwLjgpKSArCiAgZmFjZXRfZ3JpZCggLiB+IEc0X2JvbCAgKSArCiAgeGxhYigiRGVsdGFQU0kgKENvbnRyb2wgLSBLQ2wpIikgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5fQ0VbQ29vcmRzICVpbiUgdmFsaWRhdGlvbl9leG9ucyAsIF0sIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksIGNvbG91cj0iYmx1ZSIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT0yKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBLQ0xfaHVtYW5fQ0VbQ29vcmRzICVpbiUgdmFsaWRhdGlvbl9leG9ucyAsIF0sCiAgICAgICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLAogICAgICAgICAgICAgICAgICBudWRnZV95ICAgICAgPSAzLAogICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gICAgPSAieCIsCiAgICAgICAgICAgICAgICAgIGFuZ2xlICAgICAgICA9IDkwLAogICAgICAgICAgICAgICAgICB2anVzdCAgICAgICAgPSAxLAogICAgICAgICAgICAgICAgICBzZWdtZW50LnNpemUgPSAwLjIsCiAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLjA1LAogICAgICAgICAgICAgICAgICBsYWJlbD1LQ0xfaHVtYW5fQ0VbQ29vcmRzICVpbiUgdmFsaWRhdGlvbl9leG9ucyAsIGhnbmNfc3ltYm9sXSkgKwogIHlsaW0oYygwLjUsIDEuMTUpKQoKRmlnNS5BCmBgYAoKClRvIGFuYWx5c2UgYWxsIHRoZSBXaGlwcGV0IG5vZGUgdHlwZXMsIHdlIGNhbGN1bGF0ZSB0aGUgb2RkLXJhdGlvcyBvZiBiZWluZyBkaWZmZXJlbnRpYWxseSBpbmNsdWRlZCBnaXZlbiB0aGUgRzQgcHJlc2VuY2Ugb3IgYWJzZW5jZSAKCgpgYGB7cn0KCgpLQ0xfaHVtYW5bICAsIGRpZmY6PSJOQSJdCktDTF9odW1hblsgKERlbHRhUHNpPD0tMC4xICYgUHJvYmFiaWxpdHk+PTAuOSkgLCBkaWZmOj0iSW4iXQpLQ0xfaHVtYW5bIChEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT49MC45KSAsIGRpZmY6PSJFeCJdCgpLQ0xfaHVtYW5fc3RhdHMgPC0gbWVyZ2UoS0NMX2h1bWFuWyAgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiLCAgLihXT19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwgCktDTF9odW1hblsgIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgIC4oV19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwKYnk9YygiVHlwZSIsICJkaWZmIikpCgoKCktDTF9odW1hbl9zdGF0cyA8LSBtZXJnZShLQ0xfaHVtYW5fc3RhdHNbZGlmZiE9Ik5BIl0sICBLQ0xfaHVtYW5fc3RhdHNbZGlmZj09Ik5BIiAsIC4oVHlwZSwgIFdPX0c0X05BPVdPX0c0LCBXX0c0X05BPVdfRzQpIF0sIGJ5PSJUeXBlIikKCktDTF9odW1hbl9zdGF0c1ssIGA6PWAoV09fRzRfZnJhcT1XT19HNC9XT19HNF9OQSwgV19HNF9mcmFxPVdfRzQvV19HNF9OQSldCgpLQ0xfaHVtYW5fc3RhdHNbICwgT1IgOj0gV19HNF9mcmFxL1dPX0c0X2ZyYXFdCgoKCgpnZ3Bsb3QoS0NMX2h1bWFuX3N0YXRzKSArCiAgIGdlb21fdGlsZSggYWVzKFR5cGUsIGRpZmYsIGZpbGwgPSBsb2cyKE9SKSkpICsKICAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDAsIGxpbWl0cyA9IGMoLTEuNiwgMS42KSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICtsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkKYGBgCgoKV2UgdXNlIGNoaS1zcXVhcmVkIHRlc3QgdG8gY2FsY3VsYXRlIHRoZSBzaWduaWZpY2FuY2UKCgpgYGB7cn0KCgpLQ0xfaHVtYW5fc3RhdHMuY2hpIDwtIGRhdGEudGFibGUoKQoKZm9yICggaSBpbiB1bmlxdWUoS0NMX2h1bWFuX3N0YXRzW1R5cGUhPSJBTCJdJFR5cGUpKXsKICAKbWF0cml4LmV4IDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV09fRzRfTkEsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV09fRzQsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNF9OQSwgS0NMX2h1bWFuX3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXX0c0KSkKbWF0cml4LmV4X3JlcyA8LSBjaGlzcS50ZXN0KG1hdHJpeC5leCkKCm1hdHJpeC5pbiA8LSAgbWF0cml4KG5yb3c9MiwgYyhLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0X05BLCBLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0LCBLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdfRzRfTkEsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNCkpCm1hdHJpeC5pbl9yZXMgPC0gY2hpc3EudGVzdChtYXRyaXguaW4pCgoKCktDTF9odW1hbl9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX2h1bWFuX3N0YXRzLmNoaSwgY2JpbmQoaSwgIkV4IiwgbWF0cml4LmV4X3JlcyRwLnZhbHVlKSkgCktDTF9odW1hbl9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX2h1bWFuX3N0YXRzLmNoaSwgY2JpbmQoaSwgIkluIiwgbWF0cml4LmluX3JlcyRwLnZhbHVlKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCn0KCmNvbG5hbWVzKEtDTF9odW1hbl9zdGF0cy5jaGkpIDwtIGMoIlR5cGUiLCAiZGlmZiIsICJQX3ZhbHVlIikKCm50ZXN0ID0gbnJvdyhLQ0xfaHVtYW5fc3RhdHMuY2hpKQoKS0NMX2h1bWFuX3N0YXRzLmNoaVsgLCBgOj1gKFBfdmFsdWUuQm9uZmVycm9uaT1hcy5udW1lcmljKFBfdmFsdWUpKm50ZXN0KSBdCgpLQ0xfaHVtYW5fc3RhdHMgPC0gbWVyZ2UoS0NMX2h1bWFuX3N0YXRzLCBLQ0xfaHVtYW5fc3RhdHMuY2hpLCBieT1jKCJUeXBlIiwgImRpZmYiKSkKCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTIuMiwgZmlnLndpZHRoPTV9CgoKbGlicmFyeShwbHlyKQoKCmdncGxvdChLQ0xfaHVtYW5fc3RhdHMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZyhQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKCgoKYGBgCgoKCmBgYHtyfQoKc3BsaWNlX25vZGVfZG90X3Bsb3QgPC0gZnVuY3Rpb24odXBzdHJlYW0ucGF0aCwgZG93bnN0cmVhbS5wYXRoICkgewoKS0NMX3hfdXBzdHJlYW0gPC0gZnJlYWQodXBzdHJlYW0ucGF0aCAgKQpjb2xuYW1lcyhLQ0xfeF91cHN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIgICkKCgpLQ0xfeF9kb3duc3RyZWFtPC0gZnJlYWQoZG93bnN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X2Rvd25zdHJlYW0pIDwtYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIgICkKCgpLQ0xfeCA8LSAgbWVyZ2UoS0NMX3hfdXBzdHJlYW1bLCBjKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IikgXSwKICAgICAgICAgICAgICAgICAgICBLQ0xfeF9kb3duc3RyZWFtWywgYygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIpIF0sIAogICAgICAgICAgICAgICAgICAgIGJ5PWMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiKSApCgoKI0tDTF94IDwtICBLQ0xfeFtlbmQtc3RhcnQ+MzAgfHwgVHlwZSE9IkNFIiwgXQoKS0NMX3hbKEc0Lng+MCB8IEc0Lnk+MCApLCBHNF9ib2w6PSJXaXRoIEctcXVhZHJ1cGxleCJdCktDTF94WyhHNC54PT0wICYgRzQueT09MCApLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCktDTF94JEc0X2JvbCA8LSBmYWN0b3IoS0NMX3gkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSApCgoKS0NMX3hbICAsIGRpZmY6PSJOQSJdCktDTF94WyAoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT49MC45MCkgLCBkaWZmOj0iSW4iXQpLQ0xfeFsgKERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJFeCJdCgpLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeFsgIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIC4oV09fRzQ9Lk4pICwgYnk9YygiVHlwZSIsICJkaWZmIikgIF0sIApLQ0xfeFsgIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgIC4oV19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwKYnk9YygiVHlwZSIsICJkaWZmIikpCgoKCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94X3N0YXRzW2RpZmYhPSJOQSJdLCAgS0NMX3hfc3RhdHNbZGlmZj09Ik5BIiAsIC4oVHlwZSwgIFdPX0c0X05BPVdPX0c0LCBXX0c0X05BPVdfRzQpIF0sIGJ5PSJUeXBlIikKCktDTF94X3N0YXRzWywgYDo9YChXT19HNF9mcmFxPVdPX0c0L1dPX0c0X05BLCBXX0c0X2ZyYXE9V19HNC9XX0c0X05BKV0KCktDTF94X3N0YXRzWyAsIE9SIDo9IFdfRzRfZnJhcS9XT19HNF9mcmFxXQoKCktDTF94X3N0YXRzLmNoaSA8LSBkYXRhLnRhYmxlKCkKCmZvciAoIGkgaW4gdW5pcXVlKEtDTF94X3N0YXRzW1R5cGUhPSJBTCJdJFR5cGUpKXsKICAKbWF0cml4LmV4IDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXT19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdfRzQpKQptYXRyaXguZXhfcmVzIDwtIGNoaXNxLnRlc3QobWF0cml4LmV4KQoKbWF0cml4LmluIDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXT19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdfRzQpKQptYXRyaXguaW5fcmVzIDwtIGNoaXNxLnRlc3QobWF0cml4LmluKQoKCgpLQ0xfeF9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX3hfc3RhdHMuY2hpLCBjYmluZChpLCAiRXgiLCBtYXRyaXguZXhfcmVzJHAudmFsdWUpKSAKS0NMX3hfc3RhdHMuY2hpIDwtIHJiaW5kKEtDTF94X3N0YXRzLmNoaSwgY2JpbmQoaSwgIkluIiwgbWF0cml4LmluX3JlcyRwLnZhbHVlKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCn0KCmNvbG5hbWVzKEtDTF94X3N0YXRzLmNoaSkgPC0gYygiVHlwZSIsICJkaWZmIiwgIlBfdmFsdWUiKQoKbnRlc3QgPSBucm93KEtDTF94X3N0YXRzLmNoaSkKCktDTF94X3N0YXRzLmNoaVsgLCBgOj1gKFBfdmFsdWUuQm9uZmVycm9uaT1hcy5udW1lcmljKFBfdmFsdWUpKm50ZXN0KSBdCgpLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeF9zdGF0cywgS0NMX3hfc3RhdHMuY2hpLCBieT1jKCJUeXBlIiwgImRpZmYiKSkKCmdncGxvdChLQ0xfeF9zdGF0cykgKwogIGdlb21fcG9pbnQoYWVzKFR5cGUsIGRpZmYsIHNpemUgPSAtbG9nKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCgpyZXR1cm4oS0NMX3hfc3RhdHMpCgoKfQoKYGBgCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgp1cHN0cmVhbS5wYXRoID0gIi4uL0tDTC9NaWNyb0V4b25hdG9yL0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiIApkb3duc3RyZWFtLnBhdGggPSAiLi4vS0NML01pY3JvRXhvbmF0b3IvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW1fMTAwbnQuRzRzIiAKCnNwbGljZV9ub2RlX2RvdF9wbG90MiA8LSBmdW5jdGlvbih1cHN0cmVhbS5wYXRoLCBkb3duc3RyZWFtLnBhdGggKSB7CgpLQ0xfeF91cHN0cmVhbSA8LSBmcmVhZCh1cHN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X3Vwc3RyZWFtKSA8LSBjKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IiAgKQoKCktDTF94X2Rvd25zdHJlYW08LSBmcmVhZChkb3duc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfZG93bnN0cmVhbSkgPC1jKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IiAgKQoKCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRzQiKSBdLAogICAgICAgICAgICAgICAgICAgIEtDTF94X2Rvd25zdHJlYW1bLCBjKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IikgXSwgCiAgICAgICAgICAgICAgICAgICAgYnk9YygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIpICkKCgojS0NMX3ggPC0gIEtDTF94W2VuZC1zdGFydD4zMCB8fCBUeXBlIT0iQ0UiLCBdCgpLQ0xfeFsoRzQueD4wIHwgRzQueT4wICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbKEc0Lng9PTAgJiBHNC55PT0wICksIEc0X2JvbDo9IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0KS0NMX3gkRzRfYm9sIDwtIGZhY3RvcihLQ0xfeCRHNF9ib2wsIGxldmVscz1jKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpICkKCgpLQ0xfeFsgICwgZGlmZjo9Ik5BIl0KS0NMX3hbIChEZWx0YVBzaTw9LTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJJbiJdCktDTF94WyAoRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+PTAuOTApICwgZGlmZjo9IkV4Il0KCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94WyAgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiLCAgLihXT19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwgCktDTF94WyAgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCAgLihXX0c0PS5OKSAsIGJ5PWMoIlR5cGUiLCAiZGlmZiIpICBdLApieT1jKCJUeXBlIiwgImRpZmYiKSkKCgoKS0NMX3hfc3RhdHMgPC0gbWVyZ2UoS0NMX3hfc3RhdHNbZGlmZiE9Ik5BIl0sICBLQ0xfeF9zdGF0c1tkaWZmPT0iTkEiICwgLihUeXBlLCAgV09fRzRfTkE9V09fRzQsIFdfRzRfTkE9V19HNCkgXSwgYnk9IlR5cGUiKQoKS0NMX3hfc3RhdHNbLCBgOj1gKFdPX0c0X2ZyYXE9V09fRzQvV09fRzRfTkEsIFdfRzRfZnJhcT1XX0c0L1dfRzRfTkEpXQoKS0NMX3hfc3RhdHNbICwgT1IgOj0gV19HNF9mcmFxL1dPX0c0X2ZyYXFdCgoKS0NMX3hfc3RhdHMuY2hpIDwtIGRhdGEudGFibGUoKQoKZm9yICggaSBpbiB1bmlxdWUoS0NMX3hfc3RhdHNbVHlwZSE9IkFMIl0kVHlwZSkpewogIAptYXRyaXggPC0gIG1hdHJpeChucm93PTIsIGMoS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV09fRzQsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNCkpCm1hdHJpeC5yZXMgPC0gY2hpc3EudGVzdChtYXRyaXgpCgoKCgoKS0NMX3hfc3RhdHMuY2hpIDwtIHJiaW5kKEtDTF94X3N0YXRzLmNoaSwgY2JpbmQoaSwgIG1hdHJpeC5yZXMkcC52YWx1ZSkpIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKfQoKY29sbmFtZXMoS0NMX3hfc3RhdHMuY2hpKSA8LSBjKCJUeXBlIiwgIlBfdmFsdWUiKQoKbnRlc3QgPSBucm93KEtDTF94X3N0YXRzLmNoaSkKCktDTF94X3N0YXRzLmNoaVsgLCBgOj1gKFBfdmFsdWUuQm9uZmVycm9uaT1hcy5udW1lcmljKFBfdmFsdWUpKm50ZXN0KSBdCgojS0NMX3hfc3RhdHMgPC0gbWVyZ2UoS0NMX3hfc3RhdHMsIEtDTF94X3N0YXRzLmNoaSwgYnk9YygiVHlwZSIsICJkaWZmIikpCgojZ2dwbG90KEtDTF94X3N0YXRzLmNoaSkgKwojICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZyhQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiMgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDApICsKIyAgdGhlbWVfYncoKSArCiMgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKcmV0dXJuKEtDTF94X3N0YXRzLmNoaSkKCgp9CgpgYGAKCgoKCmBgYHtyfQoKZGlmZl9HNF9NRV90YWJsZSA8LSBmdW5jdGlvbih1cHN0cmVhbS5wYXRoLCBkb3duc3RyZWFtLnBhdGgsIGRpc3RfbGltICkgewoKCktDTF94X3Vwc3RyZWFtIDwtIGZyZWFkKHVwc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfdXBzdHJlYW0pIDwtIGMoIncuY2hyb20iLCAidy5zdGFydCIsICJ3LmVuZCIsICJ3LnN0cmFuZCIsICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiICApCgpLQ0xfeF91cHN0cmVhbVsgLGRpc3Q6PSgoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikgLXcuc3RhcnQgICkgXQojS0NMX3hbKGRpc3QueDw9ZGlzdF9saW0gfCBkaXN0Lnk8PWRpc3RfbGltICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KCgpLQ0xfeF9kb3duc3RyZWFtPC0gZnJlYWQoZG93bnN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X2Rvd25zdHJlYW0pIDwtIGMoIncuY2hyb20iLCAidy5zdGFydCIsICJ3LmVuZCIsICJ3LnN0cmFuZCIsICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiICApCgoKS0NMX3hfZG93bnN0cmVhbVsgLGRpc3Q6PSgoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikpIC0gdy5zdGFydCAgIF0KCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX3hfZG93bnN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sIAogICAgICAgICAgICAgICAgICAgIGJ5PWMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiKSApCgoKI0tDTF94IDwtICBLQ0xfeFtlbmQtc3RhcnQ+MzAgfHwgVHlwZSE9IkNFIiwgXQoKS0NMX3hbICwgRzRfYm9sOj0iV2l0aG91dCBHLXF1YWRydXBsZXgiXQoKS0NMX3hbc3RyYW5kPT0iKyIgJiAoKGRpc3QueCA+PSAtZGlzdF9saW0gJiAgZGlzdC54ICA8PSAwKSB8ICggZGlzdC55ID49MCAmIGRpc3QueTw9ZGlzdF9saW0pKSAsIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbc3RyYW5kPT0iLSIgJiAoKGRpc3QueSA+PSAtZGlzdF9saW0gJiAgZGlzdC55ICA8PSAwKSB8ICggZGlzdC54ID49MCAmIGRpc3QueDw9ZGlzdF9saW0pKSAsIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KCktDTF94JEc0X2JvbCA8LSBmYWN0b3IoS0NMX3gkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSApCgoKS0NMX3hbICAsIGRpZmY6PSJOQSJdCktDTF94WyAoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT49MC45MCkgLCBkaWZmOj0iSW4iXQpLQ0xfeFsgKERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJFeCJdCgoKS0NMX3ggPC0gS0NMX3hbVHlwZT09IkNFIl0KCktDTF94WyAsICBleG9uX2NsYXNzOj0iZXhvbiJdCktDTF94W2VuZC1zdGFydDw9MzAsICBleG9uX2NsYXNzOj0ibWljcm9leG9uIiBdCgpyZXR1cm4oS0NMX3gpCgp9CmBgYAoKCmBgYHtyfQoKYGBgCgoKCmBgYHtyfQp1cHN0cmVhbS5wYXRoID0gIi4uL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMudXBzdHJlYW0uRzRzZXFfSyIKZG93bnN0cmVhbS5wYXRoID0gIi4uL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMuZG93bnN0cmVhbS5HNHNlcV9LIgoKRzRfTUVfdGFibGUgPC0gZnVuY3Rpb24odXBzdHJlYW0ucGF0aCwgZG93bnN0cmVhbS5wYXRoLCBkaXN0X2xpbSApIHsKCgpLQ0xfeF91cHN0cmVhbSA8LSBmcmVhZCh1cHN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X3Vwc3RyZWFtKSA8LSBjKCAiY2hyb20iLCAic3N0YXJ0IiwgInNlbmQiLCAic3N0cmFuZCIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCktDTF94X3Vwc3RyZWFtWyAsZGlzdDo9KHNzdGFydCAtIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSkgXQojS0NMX3hbKGRpc3QueDw9ZGlzdF9saW0gfCBkaXN0Lnk8PWRpc3RfbGltICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KCgpLQ0xfeF9kb3duc3RyZWFtPC0gZnJlYWQoZG93bnN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X2Rvd25zdHJlYW0pIDwtIGMoICJjaHJvbSIsICJzc3RhcnQiLCAic2VuZCIsICJzdHJhbmQiLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCgpLQ0xfeF9kb3duc3RyZWFtWyAsZGlzdDo9KHNzdGFydCAtIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSkgXQoKS0NMX3ggPC0gIG1lcmdlKEtDTF94X3Vwc3RyZWFtWywgYyggImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiZGlzdCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX3hfZG93bnN0cmVhbVssIGMoICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgImRpc3QiKSBdLCAKICAgICAgICAgICAgICAgICAgICBieT1jKCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIpICkKCgojS0NMX3ggPC0gIEtDTF94W2VuZC1zdGFydD4zMCB8fCBUeXBlIT0iQ0UiLCBdCgpLQ0xfeFsgLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCgpLQ0xfeFsgc3RyYW5kPT0iKyIgJiAoKGRpc3QueCA+PSAtZGlzdF9saW0gJiAgZGlzdC54ICA8PSAwKSB8ICggZGlzdC55ID49MCAmIGRpc3QueTw9ZGlzdF9saW0pKSAsIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbIHN0cmFuZD09Ii0iICYgKChkaXN0LnkgPj0gLWRpc3RfbGltICYgIGRpc3QueSAgPD0gMCkgfCAoIGRpc3QueCA+PTAgJiBkaXN0Lng8PWRpc3RfbGltKSkgLCBHNF9ib2w6PSJXaXRoIEctcXVhZHJ1cGxleCJdCgoKS0NMX3gkRzRfYm9sIDwtIGZhY3RvcihLQ0xfeCRHNF9ib2wsIGxldmVscz1jKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpICkKCgpLQ0xfeFsgLCAgZXhvbl9jbGFzczo9ImV4b24iXQpLQ0xfeFtlbmQtc3RhcnQ8PTMwLCAgZXhvbl9jbGFzczo9Im1pY3JvZXhvbiIgXQoKcmV0dXJuKEtDTF94KQoKfQoKYGBgCgoKCmBgYHtyfQoKS0NMX2h1bWFuX0NFIDwtIEtDTF9odW1hblsgLCBwYXN0ZShjaHJvbSwgICBzdGFydCwgICAgIGVuZCwgc2VwPSJfIiApIF0KCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cyA8LSBmcmVhZCgiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy51cHN0cmVhbS5HNHMiKQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cyA8LSBmcmVhZCgiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy5kb3duc3RyZWFtLkc0cyIpCgoKCmNvbG5hbWVzKGh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cykgPC0gYyggImNocm9tIiwgInNzdGFydCIsICJzZW5kIiwgInNzdHJhbmQiLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiICApCgoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyAsZGlzdDo9KCAoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikgLSBzc3RhcnQgICApIF0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWywgZXhvbl9sZW46PWVuZC1zdGFydF0KCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1sgLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1sgZGlzdD49LTEwMCAgJiBkaXN0PD0wICwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQoKCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1sgLCBJRDo9cGFzdGUoY2hyb20sICAgc3RhcnQsICAgICBlbmQsIHNlcD0iXyIgKV0KCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1ssIGZpbHRlcjo9Ik91dCJdCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1sgSUQgJWluJSAgS0NMX2h1bWFuX0NFLCBdCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMgPC0gaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyBJRCAlaW4lICBLQ0xfaHVtYW5fQ0UsIF0KCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cy5zdGF0cyA8LWh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1sgZXhvbl9sZW48PTMwMCwgLk4gICwgYnk9IGMoImV4b25fbGVuIiwgIkc0X2JvbCIpIF0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLnN0YXRzWywgVG90YWw6PXN1bShOKSwgYnk9ZXhvbl9sZW5dCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cy5zdGF0c1ssIFBlcmNlbnRhZ2U6PU4qMTAwL1RvdGFsXQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzJEc0X2JvbCA8LSBmYWN0b3IoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzJEc0X2JvbCwgbGV2ZWxzPWMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikpCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwIDwtIGh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1tleG9uX2xlbjw9MzAwXQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLjMwMCRiaW4gPC0gY3V0KGh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1tleG9uX2xlbjw9MTUwXSRleG9uX2xlbiwgYnJlYWtzPTYwLCBsYWJlbHM9IHNlcSg1LCAzMDAsIDUpLCBpbmNsdWRlLmxvd2VzdD1UUlVFICkKCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cy4zMDAuc3RhdHMgPC1odW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwWyBleG9uX2xlbjw9MTUwLCAuTiAgLCBieT0gYygiYmluIiwgIkc0X2JvbCIpIF0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLjMwMC5zdGF0c1ssIFRvdGFsOj1zdW0oTiksIGJ5PWJpbl0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLjMwMC5zdGF0c1ssIFBlcmNlbnRhZ2U6PU4qMTAwL1RvdGFsXQoKbGFiZWxzPSBzZXEoLTk5NSwgMTAwMCwgNSksIGluY2x1ZGUubG93ZXN0PVRSVUUgKQoKZ2dwbG90KGh1bWFuLmV4b25zLnVwc3RyZWFtLkc0c1tmaWx0ZXI9PSJJbiJdKSArCiAgZ2VvbV9iYXIoYWVzKHg9ZXhvbl9sZW4sIGZpbGw9RzRfYm9sKSwgcG9zaXRpb24gPSAiZmlsbCIgKSArCiAgeGxpbShjKDEsIDE1MCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAzMCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG91cj0icmVkIikgKwogIHlsaW0oYygwLCAwLjEpKQoKCgpnZ3Bsb3QoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLjMwMC5zdGF0c1tHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSArCiAgZ2VvbV9iYXIoYWVzKHg9YmluLCB5PVBlcmNlbnRhZ2UpLCBzdGF0ID0gImlkZW50aXR5IiApIAoKCmBgYAoKCgpgYGB7cn0KaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMgPC0gZnJlYWQoIi4uL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMuZG93bnN0cmVhbS5HNHNlcV9QRFMiKQoKY29sbmFtZXMoaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMpIDwtIGMoICJjaHJvbSIsICJzc3RhcnQiLCAic2VuZCIsICJzc3RyYW5kIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IiAgKQoKCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyAsZGlzdDo9KCAoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikgLSBzc3RhcnQpIF0KaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIHNzdHJhbmQ9PSItIiwgZGlzdDo9KCAgIHNzdGFydCAtIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSkgXQoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbLCBleG9uX2xlbjo9ZW5kLXN0YXJ0XQoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbICwgRzRfYm9sOj0iV2l0aG91dCBHLXF1YWRydXBsZXgiXQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgZGlzdDw9MTAwICAmIGRpc3Q+PTAgLCBHNF9ib2w6PSJXaXRoIEctcXVhZHJ1cGxleCJdCgoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbLCBleG9uX2NsYXNzOj0iZXhvbiJdCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBleG9uX2xlbjw9MzAsIGV4b25fY2xhc3M6PSJtaWNyb2V4b24iXQoKCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pLApucm93KGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgoKY2hpc3EudGVzdChodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cy4yeDIpCgoKCgoKCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyAsIElEOj1wYXN0ZShjaHJvbSwgICBzdGFydCwgICAgIGVuZCwgc2VwPSJfIiApXQoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbLCBmaWx0ZXI6PSJPdXQiXQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgSUQgJWluJSAgS0NMX2h1bWFuX0NFLCAgZmlsdGVyOj0iSW4iXQoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMgPC0gaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIElEICVpbiUgIEtDTF9odW1hbl9DRSwgXQoKaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMuc3RhdHMgPC1odW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgZXhvbl9sZW48PTMwMCwgLk4gICwgYnk9IGMoImV4b25fbGVuIiwgIkc0X2JvbCIpIF0KaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMuc3RhdHNbLCBUb3RhbDo9c3VtKE4pLCBieT1leG9uX2xlbl0KaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMuc3RhdHNbLCBQZXJjZW50YWdlOj1OKjEwMC9Ub3RhbF0KCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzJEc0X2JvbCA8LSBmYWN0b3IoaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSkKCgoKZ2dwbG90KGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzKSArCiAgZ2VvbV9iYXIoYWVzKHg9ZXhvbl9sZW4sIGZpbGw9RzRfYm9sKSwgcG9zaXRpb24gPSAiZmlsbCIgKSArCiAgeGxpbShjKDEsIDMwMCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAzMCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG91cj0icmVkIikgKwogIHlsaW0oYygwLCAwLjEpKQoKCgpnZ3Bsb3QoaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMuc3RhdHNbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSkgKwogIGdlb21fYmFyKGFlcyh4PWV4b25fbGVuLCB5PVBlcmNlbnRhZ2UpLCBzdGF0ID0gImlkZW50aXR5IiApICsKICB4bGltKGMoMSwgMzAwKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMwLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3VyPSJyZWQiKSAKCmBgYAoKCgpgYGB7cn0KZ2dwbG90KGh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cykgKwogIGdlb21fYmFyKGFlcyh4PWV4b25fbGVuLCBmaWxsPUc0X2JvbCksIHBvc2l0aW9uID0gImZpbGwiICkgKwogIHhsaW0oYygxLCAxNTApKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMzApICsKICB5bGltKGMoMC44LCAxKSkKYGBgCgpgYGB7cn0KCmdncGxvdChoZzE5X01FX3RhYmxlX0c0cykgKyAKICBnZW9tX2JveHBsb3QoYWVzKEc0X2JvbCwgZXhvbl9sZW4pKSArCiAgeWxpbShjKDAsIDMwMCkpCgoKaGcxOV9NRV90YWJsZV9LWywgZXhvbl9sZW46PWVuZC1zdGFydF0KCmdncGxvdChoZzE5X01FX3RhYmxlX0spICsgCiAgZ2VvbV9ib3hwbG90KGFlcyhHNF9ib2wsIGV4b25fbGVuKSkgKwogIHlsaW0oYygwLCAzMDApKQoKaGcxOV9NRV90YWJsZV9HNHNbLCBtZWRpYW4oZXhvbl9sZW4pLCBieT1HNF9ib2xdCmhnMTlfTUVfdGFibGVfS1ssIG1lZGlhbihleG9uX2xlbiksIGJ5PUc0X2JvbF0KCmdncGxvdChoZzE5X01FX3RhYmxlX1BEUykgKyAKICBnZW9tX2JveHBsb3QoYWVzKEc0X2JvbCwgZXhvbl9sZW4pKSArCiAgeWxpbShjKDAsIDMwMCkpCgpgYGAKCgoKCmBgYHtyfQoKaHVtYW4uTUVfZzQuc3RhdHMgPC0gZGF0YS50YWJsZSgpCgpoZzE5X01FX3RhYmxlX0c0cyA8LSBHNF9NRV90YWJsZSgiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy51cHN0cmVhbS5HNHMiICwgIi4uL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMuZG93bnN0cmVhbS5HNHMiLCAxMDAgKQoKCgpoZzE5X01FX3RhYmxlX0c0cy4yeDIgPC0gbWF0cml4KG5jb2wgPSAyLApjKG5yb3coaGcxOV9NRV90YWJsZV9HNHNbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfRzRzWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhoZzE5X01FX3RhYmxlX0c0c1sgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhoZzE5X01FX3RhYmxlX0c0c1sgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKaGcxOV9NRV90YWJsZV9HNHNbICwgZXhvbl9sZW46PWVuZC1zdGFydF0KCgpjb2xuYW1lcyhoZzE5X01FX3RhYmxlX0c0cy4yeDIpIDwtIGMoImV4b24iLCAibWljcm9leG9uIikKcm93bmFtZXMoaGcxOV9NRV90YWJsZV9HNHMuMngyKSA8LSBjKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpCgoKaHVtYW4uTUVfZzQuc3RhdHMgPC0gcmJpbmQoaHVtYW4uTUVfZzQuc3RhdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3RpZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpc3EudGVzdCggaGcxOV9NRV90YWJsZV9HNHMuMngyKSRwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZzE5X01FX3RhYmxlX0c0cy4yeDJbIDIgLCAyIF0vaGcxOV9NRV90YWJsZV9HNHMuMngyWyAxICwgMiBdKSAvIChoZzE5X01FX3RhYmxlX0c0cy4yeDJbIDIgLCAxIF0vaGcxOV9NRV90YWJsZV9HNHMuMngyWyAxICwgMSBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCgoKaGcxOV9NRV90YWJsZV9LIDwtIEc0X01FX3RhYmxlKCIuLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLnVwc3RyZWFtLkc0c2VxX0siICwgIi4uL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgoKaGcxOV9NRV90YWJsZV9LLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhoZzE5X01FX3RhYmxlX0tbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfS1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9LWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfS1sgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggaGcxOV9NRV90YWJsZV9LLjJ4MikKCgpodW1hbi5NRV9nNC5zdGF0cyA8LSByYmluZChodW1hbi5NRV9nNC5zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIksrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlzcS50ZXN0KCBoZzE5X01FX3RhYmxlX0suMngyKSRwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZzE5X01FX3RhYmxlX0suMngyWyAyICwgMiBdL2hnMTlfTUVfdGFibGVfSy4yeDJbIDEgLCAyIF0pIC8gKGhnMTlfTUVfdGFibGVfSy4yeDJbIDIgLCAxIF0vaGcxOV9NRV90YWJsZV9LLjJ4MlsgMSAsIDEgXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQoKCmhnMTlfTUVfdGFibGVfUERTIDwtIEc0X01FX3RhYmxlKCIuLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy5kb3duc3RyZWFtLkc0c2VxX1BEUyIsIDEwMCApCgoKaGcxOV9NRV90YWJsZV9QRFMuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KGhnMTlfTUVfdGFibGVfUERTWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhoZzE5X01FX3RhYmxlX1BEU1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9QRFNbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9QRFNbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSkgKSkKCmNoaXNxLnRlc3QoIGhnMTlfTUVfdGFibGVfUERTLjJ4MikKCmh1bWFuLk1FX2c0LnN0YXRzIDwtIHJiaW5kKGh1bWFuLk1FX2c0LnN0YXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjYmluZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlzcS50ZXN0KCBoZzE5X01FX3RhYmxlX1BEUy4yeDIpJHAudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhnMTlfTUVfdGFibGVfUERTLjJ4MlsgMiAsIDIgXS9oZzE5X01FX3RhYmxlX1BEUy4yeDJbIDEgLCAyIF0pIC8gKGhnMTlfTUVfdGFibGVfUERTLjJ4MlsgMiAsIDEgXS9oZzE5X01FX3RhYmxlX1BEUy4yeDJbIDEgLCAxIF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKCmBgYAoKCmBgYHtyfQpjb2xuYW1lcyhodW1hbi5NRV9nNC5zdGF0cykgPC0gYygiRzRfc2lnbmFsIiwgInAudmFsdWUiLCAiT1IiKSAKCmh1bWFuLk1FX2c0LnN0YXRzWywgUF92YWx1ZS5Cb25mZXJyb25pOj1hcy5udW1lcmljKHAudmFsdWUpKjNdCgoKZ2dwbG90KGh1bWFuLk1FX2c0LnN0YXRzKSArCiAgZ2VvbV9wb2ludChhZXMoRzRfc2lnbmFsLCBsb2cyKGFzLm51bWVyaWMoT1IpKSwgc2l6ZSA9IC1sb2cxMChQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSApICkgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIApgYGAKCgoKCgpgYGB7cn0KCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLCAxMDAgKQoKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsIDEwMCApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfS19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIgLCAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLCAxMDAgKQoKCgp0b3RhbF9tb3VzZV9LX01FX3RhYmxlIDwtIHVuaXF1ZShyYmluZChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyAsIGMoImNocm9tIiAsInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJHNF9ib2wiLCAiZXhvbl9jbGFzcyIpXSwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9LX01FX3RhYmxlWyAsIGMoImNocm9tIiAsInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJHNF9ib2wiLCAiZXhvbl9jbGFzcyIpXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX0tfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfS19NRV90YWJsZVsgLCBjKCJjaHJvbSIgLCJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiRzRfYm9sIiwgImV4b25fY2xhc3MiKV0pKQoKCnRvdGFsX21vdXNlX0tfTUVfdGFibGUuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KHRvdGFsX21vdXNlX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3codG90YWxfbW91c2VfS19NRV90YWJsZVsgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggdG90YWxfbW91c2VfS19NRV90YWJsZS4yeDIpCgoKY29sbmFtZXModG90YWxfbW91c2VfS19NRV90YWJsZS4yeDIpIDwtIGMoImV4b24iLCAibWljcm9leG9uIikKcm93bmFtZXModG90YWxfbW91c2VfS19NRV90YWJsZS4yeDIpIDwtIGMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLCAxMDAgKQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX1BEU19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsIDEwMCApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCgoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlIDwtIHVuaXF1ZShyYmluZChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX1BEU19NRV90YWJsZVsgLCBjKCJjaHJvbSIgLCJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiRzRfYm9sIiwgImV4b25fY2xhc3MiKV0sCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9QRFNfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlWyAsIGMoImNocm9tIiAsInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJHNF9ib2wiLCAiZXhvbl9jbGFzcyIpXSkpCgoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyh0b3RhbF9tb3VzZV9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3codG90YWxfbW91c2VfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggdG90YWxfbW91c2VfUERTX01FX3RhYmxlLjJ4MikKYGBgCgoKYGBge3J9CgpLQ0xfaHVtYW5bLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX21vdGlmX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHMuZml4IiwgMTAwICkKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLCAxMDAgKQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfbW90aWZfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtLkc0cy5maXgiICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYuZG93bnN0cmVhbS5HNHMuZml4IiwgMTAwICkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9tb3RpZl9NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9tb3RpZl9NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX21vdGlmX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfbW90aWZfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX0tfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9LX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfS19NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfUERTX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQoKCkFsbF9tb3VzZSA8LSBkYXRhLnRhYmxlKHVuaXF1ZShjKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfS19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX0tfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9LX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9tb3RpZl9NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9tb3RpZl9NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX21vdGlmX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfbW90aWZfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0pKSkKCgpjb2xuYW1lcyhBbGxfbW91c2UpIDwtICJJRCIKCgoKCgpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfbW90aWZfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfbW90aWY6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX21vdGlmX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIEVTQ19kZXJpdmVkX25ldXJvbl9DRDFfbW90aWY6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfbW90aWZfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX21vdGlmOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX21vdGlmX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9tb3RpZjo9VFJVRSAgIF0KCkFsbF9tb3VzZVsgSUQgJWluJSBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0s6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX0tfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9LOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX0tfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX0s6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfS19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfSzo9VFJVRSAgIF0KCgpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEUzo9VFJVRSAgIF0KQWxsX21vdXNlWyBJRCAlaW4lIEVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIEVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX1BEU19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfUERTOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX1BEU19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTOj1UUlVFICAgXQoKCkFsbF9tb3VzZSA8LSBjYmluZChBbGxfbW91c2UsIHJvd1N1bXMoaXMubmEoQWxsX21vdXNlKSkpCgoKZndyaXRlKEFsbF9tb3VzZVtvcmRlcihWMildLCAiLi4vcG90YXNzaXVtX2V4cGVyaW1lbnRzL1RvdGFsX21vdXNlLnR4dCIsIG5hPSJGQUxTRSIsIHNlcCA9ICJcdCIsIHF1b3RlPUYpCgogICAgICAgCgogICAgICAgCgpodW1hbl9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHMiLCAxMDAgKSAgIApodW1hbl9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKaHVtYW5fUERTX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiICwgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsIDEwMCApICAgCiAgICAgCmh1bWFuX21vdGlmX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpodW1hbl9LX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpodW1hbl9QRFNfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgpBbGxfaHVtYW48LSBkYXRhLnRhYmxlKHVuaXF1ZShjKCAgICAgICAgIApodW1hbl9tb3RpZl9NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwgICAgICAgCmh1bWFuX0tfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCmh1bWFuX1BEU19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSkpKQoKY29sbmFtZXMoQWxsX2h1bWFuKSA8LSAiSUQiCgoKCkFsbF9odW1hblsgSUQgJWluJSBodW1hbl9tb3RpZl9NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBkaWZmX21vdGlmOj1UUlVFICAgXQpBbGxfaHVtYW5bIElEICVpbiUgaHVtYW5fS19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBkaWZmX0s6PVRSVUUgICBdCkFsbF9odW1hblsgSUQgJWluJSBodW1hbl9QRFNfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgZGlmZl86PVRSVUUgICBdCgoKCkFsbF9odW1hbiA8LSBjYmluZChBbGxfaHVtYW4sIHJvd1N1bXMoaXMubmEoQWxsX2h1bWFuKSkpCgoKZndyaXRlKEFsbF9odW1hbltvcmRlcihWMildLCAiLi4vcG90YXNzaXVtX2V4cGVyaW1lbnRzL1RvdGFsX2h1bWFuLnR4dCIsICBuYT0iRkFMU0UiLCBzZXAgPSAiXHQiLCBxdW90ZT1GKQoKCgoKCmBgYAoKCiMjIE5vdCB3b3JraW5nCgpgYGB7cn0KaHVtYW5fbW91c2UgPC0gZnJlYWQoIi4uL3BvdGFzc2l1bV9leHBlcmltZW50cy9odW1hbl9tb3VzZS4wLjIuZXhvbnMiKQoKY29sbmFtZXMoaHVtYW5fbW91c2UpIDwtIGMoImhJRCIsICJtSUQiLCAic2NvcmVfaW5kZXgiKQoKCkFsbF9odW1hbi5tb3VzZSA8LSBtZXJnZShBbGxfaHVtYW4sIGh1bWFuX21vdXNlLCBieS54PSJJRCIsIGJ5Lnk9ImhJRCIpCgoKQWxsX2h1bWFuLm1vdXNlIDwtIG1lcmdlKEFsbF9odW1hbi5tb3VzZSwgQWxsX21vdXNlLCBieS54ID0gIm1JRCIsIGJ5Lnk9IklEIikKCgoKCgpBbGxfaHVtYW4ubW91c2UuZGlmZiA8LSAgQWxsX2h1bWFuLm1vdXNlW1YyLnk8MTIgJiBWMi54PDMgXQoKCkFsbF9odW1hbi5tb3VzZS5kaWZmCgoKCgoKS0NMX2h1bWFuX0NFWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQoKCkFsbF9odW1hbi5tb3VzZS5kaWZmLmdlbmUgPC0gbWVyZ2UoQWxsX2h1bWFuLm1vdXNlLmRpZmYsIEtDTF9odW1hbl9DRSwgYnk9IklEIikKCgpWaWV3KEFsbF9odW1hbi5tb3VzZS5kaWZmLmdlbmVbb3JkZXIoVjIueSwgVjIueCAgKV1bLCBjKCJJRCIsICJtSUQiLCAiVjIueCIsICJWMi55IiwgIndpa2lnZW5lX2Rlc2NyaXB0aW9uIiwgImhnbmNfc3ltYm9sIildICkKCgpjYXQoQWxsX2h1bWFuLm1vdXNlLmRpZmYuZ2VuZVssIGhnbmNfc3ltYm9sXSwgc2VwPSJcbiIpCgpmd3JpdGUoQWxsX2h1bWFuLm1vdXNlLmRpZmYuZ2VuZVtvcmRlcihWMi55LCBWMi54ICApXVssIGMoIklEIiwgIlYyLngiLCAiVjIueSIsICJ3aWtpZ2VuZV9kZXNjcmlwdGlvbiIsICJoZ25jX3N5bWJvbCIpXSwgIi4uL3BvdGFzc2l1bV9leHBlcmltZW50cy9odW1hbi5tb3VzZS5kaWZmLkc0LmdlbmUudHh0IiwgIG5hPSJGQUxTRSIsIHNlcCA9ICJcdCIsIHF1b3RlPUYpCgpgYGAKCgoKYGBge3J9CktDTF9odW1hbltJRD0iIl0KYGBgCgoKCmBgYHtyfQoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgbWVhbihleG9uX2xlbikgXQp0b3RhbF9tb3VzZV9QRFNfTUVfdGFibGVbRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiLCAgbWVhbihleG9uX2xlbikgXQoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlWywgZXhvbl9sZW46PWVuZC1zdGFydF0KCndpbGNveC50ZXN0KCAgZXhvbl9sZW4gfiBHNF9ib2wsIGRhdGE9dG90YWxfbW91c2VfUERTX01FX3RhYmxlICkKCgoKYGBgCgoKCmBgYHtyfQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSkgKSkKCmNoaXNxLnRlc3QoIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGUuMngyKQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLCAxMDAgKQoKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGUuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3cocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3cocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpjaGlzcS50ZXN0KCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGUuMngyKQoKCgpDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgpDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhDb250cm9sX3ZzX0tDTF9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KENvbnRyb2xfdnNfS0NMX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSkgKSkKCmNoaXNxLnRlc3QoIENvbnRyb2xfdnNfS0NMX0tfTUVfdGFibGUuMngyKQoKCkNvbnRyb2xfdnNfS0NMX1BEU19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgpDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGUuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KENvbnRyb2xfdnNfS0NMX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coQ29udHJvbF92c19LQ0xfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coQ29udHJvbF92c19LQ0xfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpjaGlzcS50ZXN0KCBDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGUuMngyKQpgYGAKCgpgYGB7cn0Kc3BsaWNlX25vZGVfZG90X3Bsb3QzIDwtIGZ1bmN0aW9uKHVwc3RyZWFtLnBhdGgsIGRvd25zdHJlYW0ucGF0aCwgZGlzdF9saW0gKSB7CgpLQ0xfeF91cHN0cmVhbSA8LSBmcmVhZCh1cHN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X3Vwc3RyZWFtKSA8LSBjKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IiAgKQoKS0NMX3hfdXBzdHJlYW1bICxkaXN0Oj1hYnMody5zdGFydCAtIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSkgXQoKCktDTF94X2Rvd25zdHJlYW08LSBmcmVhZChkb3duc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfZG93bnN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCgpLQ0xfeF9kb3duc3RyZWFtWyAsZGlzdDo9YWJzKHcuc3RhcnQgLSAoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikpIF0KCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX3hfZG93bnN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sIAogICAgICAgICAgICAgICAgICAgIGJ5PWMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiKSApCgoKI0tDTF94IDwtICBLQ0xfeFtlbmQtc3RhcnQ+MzAgfHwgVHlwZSE9IkNFIiwgXQoKS0NMX3hbKGRpc3QueDw9ZGlzdF9saW0gfCBkaXN0Lnk8PWRpc3RfbGltICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbKGRpc3QueD5kaXN0X2xpbSAmIGRpc3QueT5kaXN0X2xpbSApLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCktDTF94JEc0X2JvbCA8LSBmYWN0b3IoS0NMX3gkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSApCgoKS0NMX3hbICAsIGRpZmY6PSJOQSJdCktDTF94WyAoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT49MC45MCkgLCBkaWZmOj0iSW4iXQpLQ0xfeFsgKERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJFeCJdCgpLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeFsgIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIC4oV09fRzQ9Lk4pICwgYnk9YygiVHlwZSIsICJkaWZmIikgIF0sIApLQ0xfeFsgIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgIC4oV19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwKYnk9YygiVHlwZSIsICJkaWZmIikpCgoKCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94X3N0YXRzW2RpZmYhPSJOQSJdLCAgS0NMX3hfc3RhdHNbZGlmZj09Ik5BIiAsIC4oVHlwZSwgIFdPX0c0X05BPVdPX0c0LCBXX0c0X05BPVdfRzQpIF0sIGJ5PSJUeXBlIikKCktDTF94X3N0YXRzWywgYDo9YChXT19HNF9mcmFxPVdPX0c0L1dPX0c0X05BLCBXX0c0X2ZyYXE9V19HNC9XX0c0X05BKV0KCktDTF94X3N0YXRzWyAsIE9SIDo9IFdfRzRfZnJhcS9XT19HNF9mcmFxXQoKCktDTF94X3N0YXRzLmNoaSA8LSBkYXRhLnRhYmxlKCkKCmZvciAoIGkgaW4gdW5pcXVlKEtDTF94X3N0YXRzW1R5cGUhPSJBTCJdJFR5cGUpKXsKICAKbWF0cml4LmV4IDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXT19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdfRzQpKQptYXRyaXguZXhfcmVzIDwtIGNoaXNxLnRlc3QobWF0cml4LmV4LCBjb3JyZWN0PVRSVUUpCgptYXRyaXguaW4gPC0gIG1hdHJpeChucm93PTIsIGMoS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0X05BLCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV09fRzQsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXX0c0X05BLCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNCkpCm1hdHJpeC5pbl9yZXMgPC0gY2hpc3EudGVzdChtYXRyaXguaW4sIGNvcnJlY3Q9VFJVRSkKCgoKS0NMX3hfc3RhdHMuY2hpIDwtIHJiaW5kKEtDTF94X3N0YXRzLmNoaSwgY2JpbmQoaSwgIkV4IiwgbWF0cml4LmV4X3JlcyRwLnZhbHVlKSkgCktDTF94X3N0YXRzLmNoaSA8LSByYmluZChLQ0xfeF9zdGF0cy5jaGksIGNiaW5kKGksICJJbiIsIG1hdHJpeC5pbl9yZXMkcC52YWx1ZSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp9Cgpjb2xuYW1lcyhLQ0xfeF9zdGF0cy5jaGkpIDwtIGMoIlR5cGUiLCAiZGlmZiIsICJQX3ZhbHVlIikKCm50ZXN0ID0gbnJvdyhLQ0xfeF9zdGF0cy5jaGkpCgpLQ0xfeF9zdGF0cy5jaGlbICwgYDo9YChQX3ZhbHVlLkJvbmZlcnJvbmk9YXMubnVtZXJpYyhQX3ZhbHVlKSpudGVzdCkgXQoKS0NMX3hfc3RhdHMgPC0gbWVyZ2UoS0NMX3hfc3RhdHMsIEtDTF94X3N0YXRzLmNoaSwgYnk9YygiVHlwZSIsICJkaWZmIikpCgpnZ3Bsb3QoS0NMX3hfc3RhdHMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZyhQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKcmV0dXJuKEtDTF94X3N0YXRzKQoKCn0KYGBgCgoKCgoKYGBge3J9CnRlc3QgPC0gZnJlYWQoIi4uL0tDTC9NaWNyb0V4b25hdG9yL0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW1fMTAwbnQuRzRzIikKYGBgCgojIEFRMQoKYGBge3J9CgoKCkFRMS4xLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vQVExL0NvbnRyb2xfdnNfMW11LmRpZmYuZG93bnN0cmVhbS5HNHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vQVExL0NvbnRyb2xfdnNfMW11LmRpZmYudXBzdHJlYW0uRzRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgpBUTEuMS5LIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vQVExL0NvbnRyb2xfdnNfMW11LmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0FRMS9Db250cm9sX3ZzXzFtdS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCkFRMS4xLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0FRMS9Db250cm9sX3ZzXzFtdS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0FRMS9Db250cm9sX3ZzXzFtdS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApCgoKCgoKQVExLjIubW90aWYgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9BUTEvQ29udHJvbF92c18ybXUuZGlmZi5kb3duc3RyZWFtLkc0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9BUTEvQ29udHJvbF92c18ybXUuZGlmZi51cHN0cmVhbS5HNHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCkFRMS4yLksgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9BUTEvQ29udHJvbF92c18ybXUuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vQVExL0NvbnRyb2xfdnNfMm11LmRpZmYudXBzdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApCgoKQVExLjIuUERTIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vQVExL0NvbnRyb2xfdnNfMm11LmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vQVExL0NvbnRyb2xfdnNfMm11LmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgpgYGAKCgoKCiMgUERTCgpgYGB7cn0KCkhFSy5QRFMubW90aWYgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9QRFNfY1BEUy9jbG9zZXN0L0NvbnRyb2xfdnNfUERTX0hFSy5kaWZmLnVwc3RyZWFtLkc0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9QRFNfY1BEUy9jbG9zZXN0L0NvbnRyb2xfdnNfUERTX0hFSy5kaWZmLmRvd25zdHJlYW0uRzRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgpBUTEuSyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0FRMS9Db250cm9sX3ZzXzFtdS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9BUTEvQ29udHJvbF92c18xbXUuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgpBUTEuUERTIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vQVExL0NvbnRyb2xfdnNfMW11LmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vQVExL0NvbnRyb2xfdnNfMW11LmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCmBgYAoKCgoKCgoKCmBgYHtyLCAgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTB9CgpodW1hbi5kb3RwbG90IDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MigiLi4vS0NML01pY3JvRXhvbmF0b3IvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiLCAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbV8xMDBudC5HNHMiICApCgoKCmh1bWFuLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9Db250cm9sX3ZzX0tDTC5kaWZmLnVwc3RyZWFtLkc0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9Db250cm9sX3ZzX0tDTC5kaWZmLmRvd25zdHJlYW0uRzRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgoKCmh1bWFuLksgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9Db250cm9sX3ZzX0tDTC5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSkKCgpodW1hbi5QRFMgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCmh1bWFuLm1vdGlmWyAsIEc0X3NpZ25hbDo9Ik1vdGlmIiAgXQpodW1hbi5LWyAsIEc0X3NpZ25hbDo9IksrIiAgXQpodW1hbi5QRFNbICwgRzRfc2lnbmFsOj0iUERTIiAgXQoKaHVtYW4ubW90aWZfS19QRFMgPC0gcmJpbmQoaHVtYW4ubW90aWYsIGh1bWFuLkssIGh1bWFuLlBEUykKCmh1bWFuLm1vdGlmX0tfUERTJEc0X3NpZ25hbCA8LSBmYWN0b3IoaHVtYW4ubW90aWZfS19QRFMkRzRfc2lnbmFsLCBsZXZlbHMgPSBjKCJNb3RpZiIsICJLKyIsICJQRFMiKSApCgpGaWc1LkExIDwtIGdncGxvdChodW1hbi5tb3RpZl9LX1BEUykgKwogIGdlb21fcG9pbnQoYWVzKFR5cGUsIGRpZmYsIHNpemUgPSAtbG9nMTAoUF92YWx1ZS5Cb25mZXJyb25pKSwgc2hhcGU9UF92YWx1ZS5Cb25mZXJyb25pPDAuMDUsIGNvbG91cj1sb2cyKE9SKSApICkgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDApICsKICBmYWNldF9ncmlkKEc0X3NpZ25hbCB+IC4pICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKRmlnNS5BMQpgYGAKCgoKYGBge3IsICBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMH0KCnN1cHAuZG90cGxvdC5BIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MigiLi4vS0NML01pY3JvRXhvbmF0b3IvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLnVwc3RyZWFtXzEwMG50Lkc0cyIsICAiLi4vS0NML01pY3JvRXhvbmF0b3IvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW1fMTAwbnQuRzRzIiAgKQoKCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYudXBzdHJlYW0uRzRzLmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHMuZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLksgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5QRFMgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCgoKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5tb3RpZlsgLCBHNF9zaWduYWw6PSJNb3RpZiIgIF0KRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5LWyAsIEc0X3NpZ25hbDo9IksrIiAgXQpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLlBEU1sgLCBHNF9zaWduYWw6PSJQRFMiICBdCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmX0tfUERTIDwtIHJiaW5kKEVTQ19kZXJpdmVkX25ldXJvbl9DRDEubW90aWYsIEVTQ19kZXJpdmVkX25ldXJvbl9DRDEuSywgRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5QRFMpCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmX0tfUERTJEc0X3NpZ25hbCA8LSBmYWN0b3IoRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwsIGxldmVscyA9IGMoIk1vdGlmIiwgIksrIiwgIlBEUyIpICkKCmdncGxvdChFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmX0tfUERTKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2cxMChQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIGZhY2V0X2dyaWQoRzRfc2lnbmFsIH4gLikgKwogIHlsYWIoIiIpICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKYGBgCgoKCgpgYGB7ciwgIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQoKc3VwcC5kb3RwbG90LkMgPC0gIHNwbGljZV9ub2RlX2RvdF9wbG90MigiLi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYudXBzdHJlYW1fMTAwbnQuRzRzIiwgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi5kb3duc3RyZWFtXzEwMG50Lkc0cyIgICkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEubW90aWYgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLnVwc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHMuZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuSyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEubW90aWZbICwgRzRfc2lnbmFsOj0iTW90aWYiICBdCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5LWyAsIEc0X3NpZ25hbDo9IksrIiAgXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuUERTWyAsIEc0X3NpZ25hbDo9IlBEUyIgIF0KCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5tb3RpZl9LX1BEUyA8LSByYmluZChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEubW90aWYsIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5LLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuUERTKQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLm1vdGlmX0tfUERTJEc0X3NpZ25hbCA8LSBmYWN0b3IocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLm1vdGlmX0tfUERTJEc0X3NpZ25hbCwgbGV2ZWxzID0gYygiTW90aWYiLCAiSysiLCAiUERTIikgKQoKZ2dwbG90KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5tb3RpZl9LX1BEUykgKwogIGdlb21fcG9pbnQoYWVzKFR5cGUsIGRpZmYsIHNpemUgPSAtbG9nMTAoUF92YWx1ZS5Cb25mZXJyb25pKSwgc2hhcGU9UF92YWx1ZS5Cb25mZXJyb25pPDAuMDUsIGNvbG91cj1sb2cyKE9SKSApICkgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDApICsKICBmYWNldF9ncmlkKEc0X3NpZ25hbCB+IC4pICsKICB5bGFiKCIiKSArCiAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCgpgYGAKCgoKCmBgYHtyLCAgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTB9CgpzdXBwLmRvdHBsb3QuRCA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDIoIi4uL0tDTC9NaWNyb0V4b25hdG9yL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtXzEwMG50Lkc0cyIsICAiLi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYuZG93bnN0cmVhbV8xMDBudC5HNHMiICApCgoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5tb3RpZiA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzLmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLksgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5QRFMgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSkKCgoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5tb3RpZlsgLCBHNF9zaWduYWw6PSJNb3RpZiIgIF0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLktbICwgRzRfc2lnbmFsOj0iSysiICBdCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5QRFNbICwgRzRfc2lnbmFsOj0iUERTIiAgXQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLm1vdGlmX0tfUERTIDwtIHJiaW5kKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5tb3RpZiwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLkssIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5QRFMpCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEubW90aWZfS19QRFMkRzRfc2lnbmFsIDwtIGZhY3RvcihwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEubW90aWZfS19QRFMkRzRfc2lnbmFsLCBsZXZlbHMgPSBjKCJNb3RpZiIsICJLKyIsICJQRFMiKSApCgpnZ3Bsb3QocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLm1vdGlmX0tfUERTKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2cxMChQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIGZhY2V0X2dyaWQoRzRfc2lnbmFsIH4gLikgKwogIHlsYWIoIiIpICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKYGBgCgoKCgoKCmBgYHtyLCAgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTB9CgpzdXBwLmRvdHBsb3QuQiA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDIoIi4uL0tDTC9NaWNyb0V4b25hdG9yL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYudXBzdHJlYW1fMTAwbnQuRzRzIiwgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW1fMTAwbnQuRzRzIiAgKQoKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5tb3RpZiA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHMuZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuSyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSkKCgoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLm1vdGlmWyAsIEc0X3NpZ25hbDo9Ik1vdGlmIiAgXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5LWyAsIEc0X3NpZ25hbDo9IksrIiAgXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5QRFNbICwgRzRfc2lnbmFsOj0iUERTIiAgXQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEubW90aWZfS19QRFMgPC0gcmJpbmQocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEubW90aWYsIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkssIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLlBEUykKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLm1vdGlmX0tfUERTJEc0X3NpZ25hbCA8LSBmYWN0b3IocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEubW90aWZfS19QRFMkRzRfc2lnbmFsLCBsZXZlbHMgPSBjKCJNb3RpZiIsICJLKyIsICJQRFMiKSApCgpnZ3Bsb3QocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEubW90aWZfS19QRFMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZzEwKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgZmFjZXRfZ3JpZChHNF9zaWduYWwgfiAuKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgpgYGAKCgoKYGBge3J9CgoKS0NMX2h1bWFuWyhEZWx0YVBzaTw9LTAuMSAmIFByb2JhYmlsaXR5PjAuOSksIERlbHRhX3R5cGU6PSJJbmNsdWRlZCJdCktDTF9odW1hblsoRGVsdGFQc2k+PTAuMSAmIFByb2JhYmlsaXR5PjAuOSksIERlbHRhX3R5cGU6PSJTa2lwZWQiXQpLQ0xfaHVtYW5baXMubmEoRGVsdGFfdHlwZSksIERlbHRhX3R5cGU6PSJOb25lIl0KS0NMX2h1bWFuX3N0YXRzIDwtICBLQ0xfaHVtYW5bVHlwZT09IkNFIiAsIC4oY291bnQ9Lk4pLCBieT1jKCJEZWx0YV90eXBlIiwgImV4b24iLCAiRzRfYm9sIikgXSAKS0NMX2h1bWFuX3N0YXRzWywgdG90YWw6PXN1bShjb3VudCksIGJ5PSJHNF9ib2wiXQpLQ0xfaHVtYW5fc3RhdHNbLCBmcmFjdGlvbjo9Y291bnQvdG90YWxdCgpGaWc1LkIgPC0gZ2dwbG90KCkgKwogIGdlb21fYmFyKGRhdGE9S0NMX2h1bWFuX3N0YXRzW0RlbHRhX3R5cGUhPSJOb25lIiAmIGV4b249PSJleG9uIiwgXSAsIGFlcyh4PSBHNF9ib2wsIHk9ZnJhY3Rpb24sIGdyb3VwPURlbHRhX3R5cGUsIGZpbGw9RGVsdGFfdHlwZSApICwgcG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiICApICsKICB4bGFiKCIiKSArCiAgeWxhYigiRnJhY3Rpb24gb2YgZGlmZmVyZW50aWFsbHkgaW5jbHVlZCBleG9ucyAiKSArCiAgdGhlbWVfYncoKSArCiAgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKHRpdGxlPSJBbHRlcm5hdGl2ZSBzcGxpY2luZyBldmVudCIpKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgpGaWc1LkIKCmBgYAoKCgpgYGB7cn0KCgpkaWZmLnVwIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIpCmRpZmYuZG93biA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIpCmVxbC51cCA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIpCmVxbC5kb3duIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iKQoKCmRpZmYudXBbLCBgOj1gKHR5cGU9ImRpZmYiLCBwb3M9InVwIiApXQpkaWZmLmRvd25bLCBgOj1gKHR5cGU9ImRpZmYiLCBwb3M9ImRvd24iICldCmVxbC51cFssIGA6PWAodHlwZT0iZXFsIiwgcG9zPSJ1cCIgKV0KZXFsLmRvd25bLCBgOj1gKHR5cGU9ImVxbCIsIHBvcz0iZG93biIgKV0KCgpkaWZmX2VxbCA8LSAgcmJpbmQoZGlmZi51cCwgIGRpZmYuZG93biwgZXFsLnVwLCBlcWwuZG93bikKCgpnZ3Bsb3QoZGlmZl9lcWwpICsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24sIHk9RW5ycmljaG1lbnQsIGdyb3VwPXR5cGUpKSArCiAgZmFjZXRfZ3JpZChwb3MgfiAuKSArCiAgdGhlbWVfYncoKSAKCmBgYAoKCgoKYGBge3J9CgpwbG90X2VxbF9kaWZmIDwtIGZ1bmN0aW9uKGVxbF91cF9wbHVzLCBlcWxfdXBfbWludXMsIGVxbF9kb3duX3BsdXMsIGVxbF9kb3duX21pbnVzLCBkaWZmX3VwX3BsdXMsIGRpZmZfdXBfbWludXMsIGRpZmZfZG93bl9wbHVzLCBkaWZmX2Rvd25fbWludXMgICApeyAKCgpkaWZmLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKGRpZmZfdXBfcGx1cykKZGlmZi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoZGlmZl91cF9taW51cykKZGlmZi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKGRpZmZfZG93bl9wbHVzKQpkaWZmLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKGRpZmZfZG93bl9taW51cykKZGlmZi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpkaWZmLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpkaWZmLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShkaWZmLnVwX3BsdXMsIGRpZmYudXBfbWludXMsIGRpZmYuZG93bl9wbHVzLCBkaWZmLmRvd25fbWludXMpCgoKZXFsLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKGVxbF91cF9wbHVzKQplcWwudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKGVxbF91cF9taW51cykKZXFsLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoZXFsX2Rvd25fcGx1cykKZXFsLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKGVxbF9kb3duX21pbnVzKQplcWwudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXFsLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgplcWwuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGVxbC51cF9wbHVzLCBlcWwudXBfbWludXMsIGVxbC5kb3duX3BsdXMsIGVxbC5kb3duX21pbnVzKQoKZGlmZi5UT1RBTFssIHR5cGU6PSJkaWZmIl0KZXFsLlRPVEFMWywgdHlwZTo9ImVxbCJdCgpkaWZmX2VxbC5UT1RBTCA8LSByYmluZChkaWZmLlRPVEFMLCBlcWwuVE9UQUwpCgoKZ2dwbG90KGRpZmZfZXFsLlRPVEFMKSArCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLCB5PUVucnJpY2htZW50LCBjb2xvcj10eXBlKSkgKwogIHhsaW0oYygtMjUwLDI1MCkpICsKICBmYWNldF9ncmlkKC4gfiBleG9uX3BvcyAgKSArCiAgbGFicyhjb2xvdXIgPSAiUG90YXNzaXVtIGVmZmVjdCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgp9CmBgYAoKCgoKCgoKCgpgYGB7cn0KCgoKcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCA8LSBmdW5jdGlvbihlcWxfdXBfcGx1cywgZXFsX3VwX21pbnVzLCBlcWxfZG93bl9wbHVzLCBlcWxfZG93bl9taW51cywgZGlmZl91cF9wbHVzLCBkaWZmX3VwX21pbnVzLCBkaWZmX2Rvd25fcGx1cywgZGlmZl9kb3duX21pbnVzLCBUT1RBTC5lcWwsIFRPVEFMLmRpZmYsIHNpZyAgICl7IAoKCmRpZmYudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoZGlmZl91cF9wbHVzKQpkaWZmLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZShkaWZmX3VwX21pbnVzKQpkaWZmLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoZGlmZl9kb3duX3BsdXMpCmRpZmYuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoZGlmZl9kb3duX21pbnVzKQpkaWZmLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmRpZmYuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCmRpZmYuVE9UQUwgPC0gcGxvdF9kZW5zaXR5X2Jpbm9taWFsKGRpZmYudXBfcGx1cywgZGlmZi51cF9taW51cywgZGlmZi5kb3duX3BsdXMsIGRpZmYuZG93bl9taW51cywgVE9UQUwuZGlmZiwgc2lnKQoKCmVxbC51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZShlcWxfdXBfcGx1cykKZXFsLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZShlcWxfdXBfbWludXMpCmVxbC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKGVxbF9kb3duX3BsdXMpCmVxbC5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZShlcWxfZG93bl9taW51cykKZXFsLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmVxbC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgoKZXFsLlRPVEFMIDwtIHBsb3RfZGVuc2l0eV9iaW5vbWlhbChlcWwudXBfcGx1cywgZXFsLnVwX21pbnVzLCBlcWwuZG93bl9wbHVzLCBlcWwuZG93bl9taW51cywgVE9UQUwuZXFsLCBzaWcpCgpkaWZmLlRPVEFMWywgdHlwZTo9ImRpZmYiXQplcWwuVE9UQUxbLCB0eXBlOj0iZXFsIl0KCmRpZmZfZXFsLlRPVEFMIDwtIHJiaW5kKGRpZmYuVE9UQUwsIGVxbC5UT1RBTCkKCgpnZ3Bsb3QoZGlmZl9lcWwuVE9UQUwpICsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24sIHk9RW5ycmljaG1lbnQsIGNvbG9yPXR5cGUpKSArCiAgIGdlb21fcmliYm9uKGFlcyh5bWluPUVucnJpY2htZW50X2wsIHltYXg9RW5ycmljaG1lbnRfdSwgeD1Qb3NpdGlvbiwgZmlsbD10eXBlKSwgYWxwaGE9MC4zICkrCiAgeGxpbShjKC0yNTAsMjUwKSkgKwogIGZhY2V0X2dyaWQoLiB+IGV4b25fcG9zICApICsKICBsYWJzKGNvbG91ciA9ICJQb3Rhc3NpdW0gZWZmZWN0IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2Njk5MDAiLCAiZ3JleSIpKSArICAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiM2Njk5MDAiLCAiZGFya2dyZXkiKSkKCgoKCn0KYGBgCgoKCmBgYHtyfQpLQ0xfaHVtYW4gPC0gZnJlYWQoIi4uL0tDTC9NaWNyb0V4b25hdG9yL0NvbnRyb2xfdnNfS0NMLmRpZmYiLCBzZXA9Ilx0IikKS0NMX2h1bWFuIDwtIEtDTF9odW1hblssIDE6MTFdCmNvbG5hbWVzKEtDTF9odW1hbikgPC0gYygiR2VuZSIsIk5vZGUiLCAiQ29vcmQiLCAiU3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiQ29tcGxleGl0eSIsICJFbnRyb3B5IikKaHVtYW4uQ0UuTkEgPC0gbnJvdyhLQ0xfaHVtYW5bKGFicyhEZWx0YVBzaSk8MC4xIHwgUHJvYmFiaWxpdHk8MC45KSAgJiAgVHlwZT09IkNFIl0pCmh1bWFuLkNFLmRpZmYgPC0gbnJvdyhLQ0xfaHVtYW5bYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmICBUeXBlPT0iQ0UiXSkKCgpLQ0xfRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMSA8LSBmcmVhZCgiLi4vS0NML01pY3JvRXhvbmF0b3IvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmIiwgc2VwPSJcdCIpCktDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxICA8LSBLQ0xfRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMSBbLCAxOjExXQpjb2xuYW1lcyhLQ0xfRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMSApIDwtIGMoIkdlbmUiLCJOb2RlIiwgIkNvb3JkIiwgIlN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkNvbXBsZXhpdHkiLCAiRW50cm9weSIpCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEuQ0UuTkEgPC0gbnJvdyhLQ0xfRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMSBbKGFicyhEZWx0YVBzaSk8MC4xIHwgUHJvYmFiaWxpdHk8MC45KSAgJiAgVHlwZT09IkNFIl0pCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEuQ0UuZGlmZiA8LSBucm93KEtDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiAgVHlwZT09IkNFIl0pCgoKCgpLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxICA8LSBmcmVhZCgiLi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYiLCBzZXA9Ilx0IikKS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMSAgPC0gS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMSBbLCAxOjExXQpjb2xuYW1lcyhLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxICkgPC0gYygiR2VuZSIsIk5vZGUiLCAiQ29vcmQiLCAiU3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiQ29tcGxleGl0eSIsICJFbnRyb3B5IikKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLkNFLk5BIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMSBbKGFicyhEZWx0YVBzaSk8MC4xIHwgUHJvYmFiaWxpdHk8MC45KSAgJiAgVHlwZT09IkNFIl0pCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5DRS5kaWZmIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMSBbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmICBUeXBlPT0iQ0UiXSkKCgpLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEgIDwtIGZyZWFkKCIuLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmIiwgc2VwPSJcdCIpCktDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMSAgPC0gS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxIFssIDE6MTFdCmNvbG5hbWVzKEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMSApIDwtIGMoIkdlbmUiLCJOb2RlIiwgIkNvb3JkIiwgIlN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkNvbXBsZXhpdHkiLCAiRW50cm9weSIpCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkNFLk5BIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxIFsoYWJzKERlbHRhUHNpKTwwLjEgfCBQcm9iYWJpbGl0eTwwLjkpICAmICBUeXBlPT0iQ0UiXSkKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuZGlmZiA8LSBucm93KEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMSBbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmICBUeXBlPT0iQ0UiXSkKCgoKS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSAgPC0gZnJlYWQoIi4uL0tDTC9NaWNyb0V4b25hdG9yL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmIiwgc2VwPSJcdCIpCktDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEgIDwtIEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEgWywgMToxMV0KY29sbmFtZXMoS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSApIDwtIGMoIkdlbmUiLCJOb2RlIiwgIkNvb3JkIiwgIlN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkNvbXBsZXhpdHkiLCAiRW50cm9weSIpCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5DRS5OQSA8LSBucm93KEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEgWyhhYnMoRGVsdGFQc2kpPDAuMSB8IFByb2JhYmlsaXR5PDAuOSkgICYgIFR5cGU9PSJDRSJdKQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuQ0UuZGlmZiA8LSBucm93KEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmICBUeXBlPT0iQ0UiXSkKCgpgYGAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIHBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIiwKaHVtYW4uQ0UuTkEsCmh1bWFuLkNFLmRpZmYsCjAuMDUKKQoKCmBgYAoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5OQSwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5kaWZmLAowLjA1KQpgYGAKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuZGlmZiwKMC4wNSkKYGBgCgoKCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5DRS5kaWZmLAowLjA1CikKYGBgCgoKCgoKCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuQ0UuZGlmZiwKMC4wNSkKYGBgCgoKCgoKCgojIyMgRzRzZXEgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKcGxvdF9lcWxfZGlmZigKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwgCgoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIgoKKQpgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpGaWc1LkMgPC0gcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwgCgoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKaHVtYW4uQ0UuTkEsCmh1bWFuLkNFLmRpZmYsCjAuMDUpCgoKRmlnNS5jIDwtIEZpZzUuQyAreWxpbSggYygwLjQsIDIuMSkpCgpGaWc1LmMKYGBgCgoKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKCkZpZzUuRCA8LSBwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCmh1bWFuLkNFLk5BLApodW1hbi5DRS5kaWZmLAowLjA1CikKCgpGaWc1LkQgPC0gRmlnNS5EICt5bGltKCBjKDAuNCwgMi4xKSkKRmlnNS5ECmBgYAoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLkNFLk5BLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLkNFLmRpZmYsCjAuMDUKCikKCmBgYAoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEuQ0UuTkEsCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEuQ0UuZGlmZiwKMC4wNQoKKQoKYGBgCgoKCgoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCgoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuQ0UuZGlmZiwKMC4wNQopCgpgYGAKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5DRS5OQSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLmRpZmYsCjAuMDUKKQoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCgoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuZGlmZiwKMC4wNQoKKQoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuZGlmZiwKMC4wNQoKKQoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5DRS5OQSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuZGlmZiwKMC4wNQoKKQoKYGBgCgoKCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5DRS5OQSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuZGlmZiwKMC4wNQopCgpgYGAKCgojIyMgc21vb3RoICMjIwoKCgoKYGBge3J9CgpyZXAoMToxOTk5LCBlYWNoPTQpCgpkaWZmX2VxbC5UT1RBTFsgLCBiaW46PXJlcCgxOjE5OTksIGVhY2g9NCkgXQoKCmRpZmZfZXFsLlRPVEFMWywgbWVhbl9FbnJyaWNobWVudDo9bWVhbihFbnJyaWNobWVudCkgLCBieT1iaW5dCgoKZ2dwbG90KGRpZmZfZXFsLlRPVEFMKSArCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLCB5PW1lYW5fRW5ycmljaG1lbnQsIGNvbG9yPXR5cGUpKSArCiAgeGxpbShjKC0yNTAsMjUwKSkgKwogIGZhY2V0X2dyaWQoLiB+IGV4b25fcG9zICApICsKICBsYWJzKGNvbG91ciA9ICJQb3Rhc3NpdW0gZWZmZWN0IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKYGBgCgoKI0ludHJvbiBsZW5naHQKCgpgYGB7cn0KaW50cm9uX3Vwc3RyZWFtIDwtIGZyZWFkKCIuLi9GaWd1cmVzL0ZpZ3VyZTMvSW50cm9ucy5oZzE5X3Vwc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQuaW50ZXJzZWN0X2MuRzRzIikKaW50cm9uX2Rvd25zdHJlYW0gPC0gZnJlYWQoIi4uL0ZpZ3VyZXMvRmlndXJlMy9JbnRyb25zLmhnMTlfZG93bnN0cmVhbV8xMDBudF93aW5kb3cuYmVkLmludGVyc2VjdF9jLkc0cyIpCgpjb2xuYW1lcyhpbnRyb25fdXBzdHJlYW0pIDwtIGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiSUQiLCAiaW50cm9uX3NpemUiLCAidHJhbnNjcmlwdCIsICJHNCIpCmNvbG5hbWVzKGludHJvbl9kb3duc3RyZWFtKSA8LSBjKCJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIklEIiwgImludHJvbl9zaXplIiwgInRyYW5zY3JpcHQiLCAiRzQiKQoKaW50cm9uX3Vwc3RyZWFtWywgcG9zOj0iVXBzdHJlYW0gaW50cm9uIl0KaW50cm9uX2Rvd25zdHJlYW1bLCBwb3M6PSJEb3duc3RyZWFtIGludHJvbiJdCgppbnRyb25fc2l6ZSA8LSAgcmJpbmQoaW50cm9uX3Vwc3RyZWFtLCBpbnRyb25fZG93bnN0cmVhbSkKaW50cm9uX3NpemUkcG9zIDwtIGZhY3RvcihpbnRyb25fc2l6ZSRwb3MsIGxldmVsPWMoIlVwc3RyZWFtIGludHJvbiIsICJEb3duc3RyZWFtIGludHJvbiIpKQoKCkZpZzMuQiA8LSBnZ3Bsb3QoaW50cm9uX3NpemUpICsKICBnZW9tX2RlbnNpdHkoYWVzKGludHJvbl9zaXplLCBjb2xvdXI9RzQ+MCkpICsKICBmYWNldF9ncmlkKC4gfiBwb3MpICsKICB4bGltKGMoNTAsNTAwMCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCkZpZzMuQgpgYGAKCmBgYHtyfQprcy50ZXN0KGludHJvbl9zaXplW0c0PjAsIGludHJvbl9zaXplXSwgaW50cm9uX3NpemVbRzQ9PTAsIGludHJvbl9zaXplXSkKYGBgCgoKCmBgYHtyfQpzaXplX2ludCA8LSBjKHNlcSgwLDUwMDAsMTApLCBjKDEwMDAwLCAxMDAwMDAsIDEwMDAwMDAsIDEwMDAwMDAwKSkKCgppbnRyb25fc2l6ZSRpbnRfY291bnQgPC0gY3V0KGludHJvbl9zaXplJGludHJvbl9zaXplLCBzaXplX2ludCkKCgppbnRfY291bnRzX3VwX3dfRzQgPC0gdGFibGUoaW50cm9uX3NpemVbcG9zPT0iVXBzdHJlYW0gaW50cm9uIiAmIEc0PjAsIF0kaW50X2NvdW50KQppbnRfY291bnRzX3VwX3dvX0c0IDwtIHRhYmxlKGludHJvbl9zaXplW3Bvcz09IlVwc3RyZWFtIGludHJvbiIgJiBHND09MCwgXSRpbnRfY291bnQpCmludF9jb3VudHNfdXAgPC0gcmJpbmQoaW50X2NvdW50c191cF93X0c0LCBpbnRfY291bnRzX3VwX3dvX0c0KQpjb2xuYW1lcyhpbnRfY291bnRzX3VwKSA8LSBjKHNlcSgxMCw1MDAwLDEwKSwgYygxMDAwMCwgMTAwMDAwLCAxMDAwMDAwLCAxMDAwMDAwMCkpCmludF9jb3VudHNfdXAgPC0gbWVsdChpbnRfY291bnRzX3VwKQoKCmludF9jb3VudHNfZG93bl93X0c0IDwtIHRhYmxlKGludHJvbl9zaXplW3Bvcz09IkRvd25zdHJlYW0gaW50cm9uIiAmIEc0PjAsIF0kaW50X2NvdW50KQppbnRfY291bnRzX2Rvd25fd29fRzQgPC0gdGFibGUoaW50cm9uX3NpemVbcG9zPT0iRG93bnN0cmVhbSBpbnRyb24iICYgRzQ9PTAsIF0kaW50X2NvdW50KQppbnRfY291bnRzX2Rvd24gPC0gcmJpbmQoaW50X2NvdW50c19kb3duX3dfRzQsIGludF9jb3VudHNfZG93bl93b19HNCkKY29sbmFtZXMoaW50X2NvdW50c19kb3duKSA8LSBjKHNlcSgxMCw1MDAwLDEwKSwgYygxMDAwMCwgMTAwMDAwLCAxMDAwMDAwLCAxMDAwMDAwMCkpCmludF9jb3VudHNfZG93biA8LSBtZWx0KGludF9jb3VudHNfZG93bikKCmludHJvbl9zaXplX2ludHMgPC0gcmJpbmQoaW50X2NvdW50c191cCwgaW50X2NvdW50c19kb3duKQoKY29sbmFtZXMoaW50cm9uX3NpemVfaW50cykgPC0gYygiZmFjdG9yIiwgImludCIsICJjb3VudCIpCgppbnRyb25fc2l6ZV9pbnRzIDwtIGRhdGEudGFibGUoaW50cm9uX3NpemVfaW50cykKCgppbnRyb25fc2l6ZV9pbnRzWyAsIHRvdGFsOj1zdW0oY291bnQpICwgYnk9ImZhY3RvciIgXQppbnRyb25fc2l6ZV9pbnRzWyAsIGZyYWM6PShjb3VudC90b3RhbCkgXQoKaW50cm9uX3NpemVfaW50c191cCA8LSBtZXJnZShpbnRyb25fc2l6ZV9pbnRzWyBmYWN0b3I9PSJpbnRfY291bnRzX3VwX3dfRzQiLCBdLCBpbnRyb25fc2l6ZV9pbnRzWyBmYWN0b3I9PSJpbnRfY291bnRzX3VwX3dvX0c0IiwgXSwgYnk9ImludCIgKQppbnRyb25fc2l6ZV9pbnRzX3VwWyAsIHJlbGF0aXZlX2ZyYWM6PWZyYWMueC9mcmFjLnkgXQoKaW50cm9uX3NpemVfaW50c19kb3duIDwtIG1lcmdlKGludHJvbl9zaXplX2ludHNbIGZhY3Rvcj09ImludF9jb3VudHNfZG93bl93X0c0IiwgXSwgaW50cm9uX3NpemVfaW50c1sgZmFjdG9yPT0iaW50X2NvdW50c19kb3duX3dvX0c0IiwgXSwgYnk9ImludCIgKQppbnRyb25fc2l6ZV9pbnRzX2Rvd25bICwgcmVsYXRpdmVfZnJhYzo9ZnJhYy54L2ZyYWMueSBdCgppbnRyb25fc2l6ZV9pbnRzX3VwWywgcG9zOj0iVXBzdHJlYW0gaW50cm9uIl0KaW50cm9uX3NpemVfaW50c19kb3duWywgcG9zOj0iRG93bnN0cmVhbSBpbnRyb24iXQoKaW50cm9uX3NpemVfaW50c190b3RhbCA8LSByYmluZChpbnRyb25fc2l6ZV9pbnRzX3VwLCBpbnRyb25fc2l6ZV9pbnRzX2Rvd24pCgppbnRyb25fc2l6ZV9pbnRzX3RvdGFsJHBvcyA8LSBmYWN0b3IoaW50cm9uX3NpemVfaW50c190b3RhbCRwb3MsIGxldmVsPWMoIlVwc3RyZWFtIGludHJvbiIsICJEb3duc3RyZWFtIGludHJvbiIpKQoKCgpGaWczLkMgPC0gZ2dwbG90KGludHJvbl9zaXplX2ludHNfdG90YWwsIGFlcyhpbnQsIGxvZzIocmVsYXRpdmVfZnJhYykpICApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX3BvaW50KCkgKwogIHN0YXRfc21vb3RoKCBtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHBvbHkoeCwgOCkpICsKICB4bGltKGMoMCwgMjAwMCkpICsKICB5bGltKGMoLTIsMikpICsKICBmYWNldF9ncmlkKC4gfiBwb3MpCgpGaWczLkMKCmBgYAoKCgpgYGB7cn0KCmludHJvbl9zaXplX2ludHNfdG90YWxbIHJlbGF0aXZlX2ZyYWMgJWluJSBpbnRyb25fc2l6ZV9pbnRzX3RvdGFsWywgbWF4KHJlbGF0aXZlX2ZyYWMpLCBieT1wb3NdJFYxLCBdCgpgYGAKCgoKYGBge3J9CiBVcHN0cmVhbV9VMl9zY29yZV9sZW4gPC0gZnJlYWQoIi4uL0ZpZ3VyZXMvRmlndXJlMy9VcHN0cmVhbV9VMl9zY29yZV9sZW5fbWF0cml4LnR4dDIub2xkIikKIERvd25zdHJlYW1fVTJfc2NvcmVfbGVuIDwtIGZyZWFkKCIuLi9GaWd1cmVzL0ZpZ3VyZTMvRG93bnN0cmVhbV9VMl9zY29yZV9sZW5fbWF0cml4LnR4dDIub2xkIikKIAogCiBVcHN0cmVhbV9VMl9zY29yZV9sZW4gPC1kYXRhLnRhYmxlOjptZWx0KFVwc3RyZWFtX1UyX3Njb3JlX2xlbiwgaWQudmFycz0nSUwnKQpEb3duc3RyZWFtX1UyX3Njb3JlX2xlbiA8LSBkYXRhLnRhYmxlOjptZWx0KERvd25zdHJlYW1fVTJfc2NvcmVfbGVuLCBpZC52YXJzPSdJTCcpCgpVcHN0cmVhbV9VMl9zY29yZV9sZW5bLCBwb3M6PSJVcHN0cmVhbSBpbnRyb24iXQpEb3duc3RyZWFtX1UyX3Njb3JlX2xlblssIHBvczo9IkRvd25zdHJlYW0gaW50cm9uIl0KCgogCkZpZzMuRDEgPC0gIGdncGxvdChVcHN0cmVhbV9VMl9zY29yZV9sZW4pICsKICAgZ2VvbV90aWxlKCBhZXModmFyaWFibGUsIGFzLmZhY3RvcihJTCksIGZpbGwgPSB2YWx1ZSoxMDApKSArCiAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAxMi41LCBsaW1pdHMgPSBjKDAsIDI1KSkgKwogICBmYWNldF9ncmlkKC4gfiBwb3MpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpCiAKIApGaWczLkQyIDwtICBnZ3Bsb3QoRG93bnN0cmVhbV9VMl9zY29yZV9sZW4pICsKICAgZ2VvbV90aWxlKCBhZXModmFyaWFibGUsIGFzLmZhY3RvcihJTCksIGZpbGwgPSB2YWx1ZSoxMDApKSArCiAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAxMi41LCBsaW1pdHMgPSBjKDAsIDI1KSkgKwogICBmYWNldF9ncmlkKC4gfiBwb3MpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpCgpGaWczLkQgPC0gcGxvdF9ncmlkKEZpZzMuRDEsIEZpZzMuRDIpCiBGaWczLkQKYGBgCgoKCgpgYGB7cn0KCmNsb3Nlc3RfZzQgPC0gZnVuY3Rpb24oZGlzdC5leG9uX3VwX3BsdXNfcGF0aCwgZGlzdC5leG9uX3VwX21pbnVzX3BhdGgsIGRpc3QuZXhvbl9kb3duX3BsdXNfcGF0aCwgZGlzdC5leG9uX2Rvd25fbWludXNfcGF0aCl7CgpkaXN0LmV4b25fdXBfcGx1cyA8LSBmcmVhZChkaXN0LmV4b25fdXBfcGx1c19wYXRoKQpjb2xuYW1lcyhkaXN0LmV4b25fdXBfcGx1cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX3VwX3BsdXNbLCBnbWlkOj0gZ3N0YXJ0ICsgKGdlbmQtZ3N0YXJ0KS8yXQpkaXN0LmV4b25fdXBfcGx1c1sgLCAgZGlzdDo9Z21pZCAtIGVzdGFydF0KCgpkaXN0LmV4b25fdXBfbWludXMgPC0gZnJlYWQoZGlzdC5leG9uX3VwX21pbnVzX3BhdGgpCmNvbG5hbWVzKGRpc3QuZXhvbl91cF9taW51cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX3VwX21pbnVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX3VwX21pbnVzWyAsICBkaXN0Oj0gZXN0YXJ0IC0gZ21pZF0KCgpkaXN0LmV4b25fZG93bl9wbHVzIDwtIGZyZWFkKGRpc3QuZXhvbl9kb3duX3BsdXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX2Rvd25fcGx1cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX2Rvd25fcGx1c1ssIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmRpc3QuZXhvbl9kb3duX3BsdXNbICwgIGRpc3Q6PWdtaWQgLSBlc3RhcnRdCgoKZGlzdC5leG9uX2Rvd25fbWludXMgPC0gZnJlYWQoZGlzdC5leG9uX2Rvd25fbWludXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX2Rvd25fbWludXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl9kb3duX21pbnVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX2Rvd25fbWludXNbICwgIGRpc3Q6PSBlc3RhcnQgLSBnbWlkXQoKCmRpc3QuZXhvbl91cCA8LSByYmluZChkaXN0LmV4b25fdXBfcGx1cywgZGlzdC5leG9uX3VwX21pbnVzKSAKZGlzdC5leG9uX2Rvd24gPC0gcmJpbmQoZGlzdC5leG9uX2Rvd25fcGx1cywgZGlzdC5leG9uX2Rvd25fbWludXMpCgpkaXN0LmV4b25fdXBbLCBwb3M6PSIzJ1NwbGljZSBzaXRlIl0KZGlzdC5leG9uX2Rvd25bLCBwb3M6PSI1J1NwbGljZSBzaXRlIl0KCmRpc3QuZXhvbiA8LSByYmluZChkaXN0LmV4b25fdXAsIGRpc3QuZXhvbl9kb3duKQoKcmV0dXJuKGRpc3QuZXhvbikKCn0KCgoKYGBgCgoKCmBgYHtyfQpleG9uLnVwLm1vdGlmIDwtIGZyZWFkKCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbnMudXAuY2xvc2VzdF9HNF9jbGVhbiIpCmNvbG5hbWVzKGV4b24udXAubW90aWYpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIpCgpleG9uLnVwLm1vdGlmWyAsIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmV4b24udXAubW90aWZbICBzdHJhbmQ9PSIrIiAgLCAgZGlzdDo9Z21pZCAtIGVzdGFydF0KZXhvbi51cC5tb3RpZlsgIHN0cmFuZD09Ii0iICAsICBkaXN0Oj0gZXN0YXJ0IC0gZ21pZF0KCgpleG9uLmRvd24ubW90aWYgPC0gZnJlYWQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9ucy5kb3duLmNsb3Nlc3RfRzRfY2xlYW4iKQpjb2xuYW1lcyhleG9uLmRvd24ubW90aWYpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIpCgpleG9uLmRvd24ubW90aWZbICwgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZXhvbi5kb3duLm1vdGlmWyAgc3RyYW5kPT0iKyIgICwgIGRpc3Q6PWdtaWQgLSBlc3RhcnRdCmV4b24uZG93bi5tb3RpZlsgIHN0cmFuZD09Ii0iICAsICBkaXN0Oj0gZXN0YXJ0IC0gZ21pZF0KCgoKZXhvbi51cC5tb3RpZlssIHBvczo9IjMnU3BsaWNlIHNpdGUiXQpleG9uLmRvd24ubW90aWZbLCBwb3M6PSI1J1NwbGljZSBzaXRlIl0KCmV4b24uZGlzdC5tb3RpZiA8LSByYmluZChleG9uLnVwLm1vdGlmLCBleG9uLmRvd24ubW90aWYpCgoKZ2dwbG90KGV4b24uZGlzdC5tb3RpZikgKwogIGdlb21fZGVuc2l0eShhZXMoZGlzdCkpICsKICB4bGltKGMoLTEwMDAsIDEwMDApKSArCiAgZmFjZXRfZ3JpZCguIH4gcG9zKQogCmBgYAoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTd9CgpjbG9zZXN0X2c0X0tDTCA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIikKCgoKY2xvc2VzdF9nNF9QRFMgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIikKCgpjbG9zZXN0X2c0X0tDTFssIFR5cGU6PSJHNC1zZXEgSysiXQpjbG9zZXN0X2c0X1BEU1ssIFR5cGU6PSJHNC1zZXEgUERTIl0KZXhvbi5kaXN0Lm1vdGlmWywgVHlwZTo9IkNvbnNlbnN1cyBHNCBtb3RpZiJdCgoKY2xvc2VzdF9nNF9LQ0wgPC0gdW5pcXVlKGNsb3Nlc3RfZzRfS0NMWyAsIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJkaXN0IiwgInBvcyIsICJUeXBlIildKQpjbG9zZXN0X2c0X1BEUyA8LSB1bmlxdWUoY2xvc2VzdF9nNF9QRFNbICwgYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImRpc3QiLCAicG9zIiwgICJUeXBlIildKQpleG9uLmRpc3QubW90aWYgPC0gdW5pcXVlKGV4b24uZGlzdC5tb3RpZlsgLCBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZGlzdCIsICJwb3MiLCAiVHlwZSIpXSkKCgpjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYgPC0gcmJpbmQoY2xvc2VzdF9nNF9LQ0wsIGNsb3Nlc3RfZzRfUERTLCBleG9uLmRpc3QubW90aWYpCgpGaWcxLkIgPC0gZ2dwbG90KGNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZikgKwogIGdlb21fZGVuc2l0eShhZXMoZGlzdCwgY29sb3VyPVR5cGUpLCBidz0xMCkgKwogIHhsaW0oYygtMTAwMCwgMTAwMCkpICsKICBmYWNldF9ncmlkKFR5cGUgfiBwb3MpICsKICB4bGFiKCJEaXN0YW5jZSIpICsKICB5bGFiKCJEZW5zaXR5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAgKyAKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KCBhbmdsZSA9IDQ1KSkgCgpGaWcxLkIgKyB4bGltKGMoLTMwMCwgMzAwKSkKCmBgYAoKCgoKCgpgYGB7cn0KCiNjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYKCgpjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiIDwtIGNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZlthYnMoZGlzdCk8PTEwMDAgLCBdCgpjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiWywgYmluOj1jdXQoZGlzdCwgc2VxKC0xMDAwLCAxMDAwLCA1KSwgbGFiZWxzPSBzZXEoLTk5NSwgMTAwMCwgNSksIGluY2x1ZGUubG93ZXN0PVRSVUUgKSBdCgoKY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50IDwtIGNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2JbICwgLihPY2N1cnJlbmNlcz0uTikgLCBieT1jKCJkaXN0IiwgInBvcyIsICJUeXBlIildCgoKY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50Lm1lZGlhbiA8LSAgY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50WywgLihtZWRpYW49bWVkaWFuKE9jY3VycmVuY2VzKSksIGJ5PWMoICJwb3MiLCAiVHlwZSIpIF0KCgpjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnQgPC0gbWVyZ2UoY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50LCBjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnQubWVkaWFuLCBieT1jKCAicG9zIiwgIlR5cGUiKSkgCgpjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnRbLCBFbnJyaWNobWVudDo9T2NjdXJyZW5jZXMvbWVkaWFuXQoKY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50W1R5cGU9PSJDb25zZW5zdXMgRzQgbW90aWYiLCBUeXBlOj0iRzQgbW90aWYiIF0KCgojY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50WyAsIGJpbjo9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYmluKSldCgoKZ2dwbG90KGNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudCkgKwogIGdlb21fbGluZShhZXMoZGlzdCwgRW5ycmljaG1lbnQsIGNvbG91cj1UeXBlKSkgKwogIHhsaW0oYygtMTAwMCwgMTAwMCkpICsKICBmYWNldF9ncmlkKFR5cGUgfiBwb3MpICsKICB4bGFiKCJEaXN0YW5jZSIpICsKICB5bGFiKCJFbnJpY2htZW50IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAgKyAKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KCBhbmdsZSA9IDQ1KSkgCgoKCgoKCmBgYAoKCgoKYGBge3J9CgpjbG9zZXN0X2c0XzIwMTUgPC0gZnVuY3Rpb24oZGlzdC5leG9uX3VwX3BsdXNfcGF0aCwgZGlzdC5leG9uX3VwX21pbnVzX3BhdGgsIGRpc3QuZXhvbl9kb3duX3BsdXNfcGF0aCwgZGlzdC5leG9uX2Rvd25fbWludXNfcGF0aCl7CgpkaXN0LmV4b25fdXBfcGx1cyA8LSBmcmVhZChkaXN0LmV4b25fdXBfcGx1c19wYXRoKQpjb2xuYW1lcyhkaXN0LmV4b25fdXBfcGx1cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImV4b25fZGlzdCIpCgpkaXN0LmV4b25fdXBfcGx1c1ssIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmRpc3QuZXhvbl91cF9wbHVzWyAsICBkaXN0Oj1nbWlkIC0gZXN0YXJ0XQoKCmRpc3QuZXhvbl91cF9taW51cyA8LSBmcmVhZChkaXN0LmV4b25fdXBfbWludXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX3VwX21pbnVzKSA8LSBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZXhvbiIsICJjZXJvIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAgImV4b25fZGlzdCIpCgpkaXN0LmV4b25fdXBfbWludXNbLCBnbWlkOj0gZ3N0YXJ0ICsgKGdlbmQtZ3N0YXJ0KS8yXQpkaXN0LmV4b25fdXBfbWludXNbICwgIGRpc3Q6PSBlc3RhcnQgLSBnbWlkXQoKCmRpc3QuZXhvbl9kb3duX3BsdXMgPC0gZnJlYWQoZGlzdC5leG9uX2Rvd25fcGx1c19wYXRoKQpjb2xuYW1lcyhkaXN0LmV4b25fZG93bl9wbHVzKSA8LSBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZXhvbiIsICJjZXJvIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAgImV4b25fZGlzdCIpCgpkaXN0LmV4b25fZG93bl9wbHVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX2Rvd25fcGx1c1sgLCAgZGlzdDo9Z21pZCAtIGVzdGFydF0KCgpkaXN0LmV4b25fZG93bl9taW51cyA8LSBmcmVhZChkaXN0LmV4b25fZG93bl9taW51c19wYXRoKQpjb2xuYW1lcyhkaXN0LmV4b25fZG93bl9taW51cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX2Rvd25fbWludXNbLCBnbWlkOj0gZ3N0YXJ0ICsgKGdlbmQtZ3N0YXJ0KS8yXQpkaXN0LmV4b25fZG93bl9taW51c1sgLCAgZGlzdDo9IGVzdGFydCAtIGdtaWRdCgoKZGlzdC5leG9uX3VwIDwtIHJiaW5kKGRpc3QuZXhvbl91cF9wbHVzLCBkaXN0LmV4b25fdXBfbWludXMpIApkaXN0LmV4b25fZG93biA8LSByYmluZChkaXN0LmV4b25fZG93bl9wbHVzLCBkaXN0LmV4b25fZG93bl9taW51cykKCmRpc3QuZXhvbl91cFssIHBvczo9IjMnU3BsaWNlIHNpdGUiXQpkaXN0LmV4b25fZG93blssIHBvczo9IjUnU3BsaWNlIHNpdGUiXQoKZGlzdC5leG9uIDwtIHJiaW5kKGRpc3QuZXhvbl91cCwgZGlzdC5leG9uX2Rvd24pCgpyZXR1cm4oZGlzdC5leG9uKQoKfQoKCgpgYGAKCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD03fQoKY2xvc2VzdF9nNF9LQ0xfMjAxNSA8LSBjbG9zZXN0X2c0XzIwMTUoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiKQoKCgpjbG9zZXN0X2c0X1BEU18yMDE1IDwtIGNsb3Nlc3RfZzRfMjAxNSgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIikKCgpjbG9zZXN0X2c0X0tDTF8yMDE1WywgVHlwZTo9Ikc0LXNlcSBOYSsgSysiXQpjbG9zZXN0X2c0X1BEU18yMDE1WywgVHlwZTo9Ikc0LXNlcSBOYSsgUERTIl0KCgoKY2xvc2VzdF9nNF9LQ0xfMjAxNSA8LSB1bmlxdWUoY2xvc2VzdF9nNF9LQ0xfMjAxNVsgLCBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZGlzdCIsICJwb3MiLCAiVHlwZSIpXSkKY2xvc2VzdF9nNF9QRFNfMjAxNSA8LSB1bmlxdWUoY2xvc2VzdF9nNF9QRFNfMjAxNVsgLCBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZGlzdCIsICJwb3MiLCAgIlR5cGUiKV0pCgoKCmNsb3Nlc3RfZzRfS0NMX1BEU18yMDE1IDwtIHJiaW5kKGNsb3Nlc3RfZzRfS0NMXzIwMTUsIGNsb3Nlc3RfZzRfUERTXzIwMTUpCgpnZ3Bsb3QoY2xvc2VzdF9nNF9LQ0xfUERTXzIwMTUpICsKICBnZW9tX2xpbmUoYWVzKGRpc3QsIGNvbG91cj1UeXBlKSwgYnc9MTAsIHN0YXQ9ImRlbnNpdHkiKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoVHlwZSB+IHBvcykgKwogIHhsYWIoIkRpc3RhbmNlIikgKwogIHlsYWIoIkRlbnNpdHkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICArIAogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoIGFuZ2xlID0gNDUpKSAKCgoKYGBgCgoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTd9CmNsb3Nlc3RfZzRfS0NMLnNhY0NlcjMgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5iZWQuc2FjQ2VyMy5jbG9zZXN0LkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5iZWQuc2FjQ2VyMy5jbG9zZXN0LkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgpjbG9zZXN0X2c0X1BEUy5zYWNDZXIzIDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuYmVkLnNhY0NlcjMuY2xvc2VzdC5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuYmVkLnNhY0NlcjMuY2xvc2VzdC5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuYmVkLnNhY0NlcjMuY2xvc2VzdC5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKY2xvc2VzdF9nNF9LQ0wudGFpcjEwIDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIikKCmNsb3Nlc3RfZzRfUERTLnRhaXIxMCA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIikKCgpjbG9zZXN0X2c0X0tDTC5kYW5SZXIxMCA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuZGFuUmVyMTAuY2xvc2VzdC5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuZGFuUmVyMTAuY2xvc2VzdC5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIikKCgpjbG9zZXN0X2c0X1BEUy5kYW5SZXIxMCA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLmRtNiA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmRtNi5jbG9zZXN0LkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmRtNi5jbG9zZXN0LkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmRtNi5jbG9zZXN0LkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiKQoKCmNsb3Nlc3RfZzRfUERTLmRtNiA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmRtNi5jbG9zZXN0LkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmRtNi5jbG9zZXN0LkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmRtNi5jbG9zZXN0LkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKY2xvc2VzdF9nNF9LQ0wubW0xMCA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgpjbG9zZXN0X2c0X1BEUy5tbTEwIDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMubW0xMC5jbG9zZXN0LkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMubW0xMC5jbG9zZXN0LkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLmhnMTkgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgpjbG9zZXN0X2c0X1BEUy5oZzE5IDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKCmNsb3Nlc3RfZzRfS0NMLmNlMTAgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5jZTEwLmNsb3Nlc3QuR1NNMzAwMzUzOF9DZWxlZ2Fuc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM3X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5jZTEwLmNsb3Nlc3QuR1NNMzAwMzUzN19DZWxlZ2Fuc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM3X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgoKY2xvc2VzdF9nNF9QRFMuY2UxMCA8LSBjbG9zZXN0X2c0KCIuLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM4X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuY2UxMC5jbG9zZXN0LkdTTTMwMDM1MzhfQ2VsZWdhbnNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuY2UxMC5jbG9zZXN0LkdTTTMwMDM1MzhfQ2VsZWdhbnNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM4X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIikKCgoKICAKCgpjbG9zZXN0X2c0X0tDTC5zYWNDZXIzWywgYDo9YChUcmVhdG1lbnQ9IktDbCIsIFNwZWNpZXM9IlMuIGNlcmV2aXNpYWUiKSBdCmNsb3Nlc3RfZzRfUERTLnNhY0NlcjNbLCBgOj1gKFRyZWF0bWVudD0iUERTIiwgU3BlY2llcz0iUy4gY2VyZXZpc2lhZSIpIF0KY2xvc2VzdF9nNF9LQ0wudGFpcjEwWywgYDo9YChUcmVhdG1lbnQ9IktDbCIsIFNwZWNpZXM9IkEuIHRoYWxpYW5hIiApIF0KY2xvc2VzdF9nNF9QRFMudGFpcjEwWywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9IkEuIHRoYWxpYW5hIiApIF0KY2xvc2VzdF9nNF9LQ0wuZGFuUmVyMTBbLCBgOj1gKFRyZWF0bWVudD0iS0NsIiwgU3BlY2llcz0iRC4gcmVyaW8iICApIF0KY2xvc2VzdF9nNF9QRFMuZGFuUmVyMTBbLCBgOj1gKFRyZWF0bWVudD0iUERTIiwgU3BlY2llcz0iRC4gcmVyaW8iICApIF0KY2xvc2VzdF9nNF9LQ0wuZG02WywgYDo9YChUcmVhdG1lbnQ9IktDbCIsIFNwZWNpZXM9ICJELiBtZWxhbm9nYXN0ZXIiICkgXQpjbG9zZXN0X2c0X1BEUy5kbTZbLCBgOj1gKFRyZWF0bWVudD0iUERTIiwgU3BlY2llcz0gICJELiBtZWxhbm9nYXN0ZXIiICkgXQpjbG9zZXN0X2c0X0tDTC5tbTEwWywgYDo9YChUcmVhdG1lbnQ9IktDbCIsIFNwZWNpZXM9Ik0uIG11c2N1bHVzIiAgKSBdCmNsb3Nlc3RfZzRfUERTLm1tMTBbLCBgOj1gKFRyZWF0bWVudD0iUERTIiwgU3BlY2llcz0iTS4gbXVzY3VsdXMiICApIF0KY2xvc2VzdF9nNF9LQ0wuaGcxOVssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSJILiBzYXBpZW5zIiAgICApIF0KY2xvc2VzdF9nNF9QRFMuaGcxOVssIGA6PWAoVHJlYXRtZW50PSJQRFMiLCBTcGVjaWVzPSJILiBzYXBpZW5zIiAgICApIF0KY2xvc2VzdF9nNF9LQ0wuY2UxMFssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSJDLiBlbGVnYW5zIiAgICApIF0KY2xvc2VzdF9nNF9QRFMuY2UxMFssIGA6PWAoVHJlYXRtZW50PSJQRFMiLCBTcGVjaWVzPSJDLiBlbGVnYW5zIiAgICkgXQoKCmNsb3Nlc3RfZzQuVE9UQUwgPC0gcmJpbmQoY2xvc2VzdF9nNF9LQ0wuc2FjQ2VyMywKY2xvc2VzdF9nNF9QRFMuc2FjQ2VyMywKY2xvc2VzdF9nNF9LQ0wudGFpcjEwLApjbG9zZXN0X2c0X1BEUy50YWlyMTAsCmNsb3Nlc3RfZzRfS0NMLmRhblJlcjEwLApjbG9zZXN0X2c0X1BEUy5kYW5SZXIxMCwKY2xvc2VzdF9nNF9LQ0wuZG02LApjbG9zZXN0X2c0X1BEUy5kbTYsCmNsb3Nlc3RfZzRfS0NMLm1tMTAsCmNsb3Nlc3RfZzRfUERTLm1tMTAsCmNsb3Nlc3RfZzRfS0NMLmhnMTksCmNsb3Nlc3RfZzRfUERTLmhnMTksCmNsb3Nlc3RfZzRfS0NMLmhnMTksCmNsb3Nlc3RfZzRfUERTLmhnMTkpCgoKZ2dwbG90KGNsb3Nlc3RfZzQuVE9UQUwpICsKICBnZW9tX2xpbmUoYWVzKGRpc3QsIGNvbG91cj1TcGVjaWVzKSwgYnc9MTAsIHN0YXQ9ImRlbnNpdHkiKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoVHJlYXRtZW50IH4gcG9zKSArCiAgeGxhYigiRGlzdGFuY2UiKSArCiAgeWxhYigiRGVuc2l0eSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcsIAogICAgYW5nbGUgPSA0NSkpIAoKCgoKYGBgCgoKCmBgYHtyfQpjbG9zZXN0X2c0LlRPVEFMLjFrYiA8LSBjbG9zZXN0X2c0LlRPVEFMW2FicyhkaXN0KTw9MTAwMCAsIF0KCmNsb3Nlc3RfZzQuVE9UQUwuMWtiWywgYmluOj1jdXQoZGlzdCwgc2VxKC0xMDAwLCAxMDAwLCA1KSwgbGFiZWxzPSBzZXEoLTk5NSwgMTAwMCwgNSkgKSBdCgoKY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudCA8LSBjbG9zZXN0X2c0LlRPVEFMLjFrYlsgLCAuKE9jY3VycmVuY2VzPS5OKSAsIGJ5PWMoImJpbiIsICJwb3MiLCAiVHJlYXRtZW50IiwgIlNwZWNpZXMiKV0KCgpjbG9zZXN0X2c0LlRPVEFMLjFrYi5lbnJpY2htZW50Lm1lZGlhbiA8LSAgY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudFssIC4obWVkaWFuPW1lZGlhbihPY2N1cnJlbmNlcykpLCBieT1jKCAicG9zIiwgIlRyZWF0bWVudCIsICJTcGVjaWVzIikgXQoKCmNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnQgPC0gbWVyZ2UoY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudCwgY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudC5tZWRpYW4sIGJ5PWMoICJwb3MiLCAiVHJlYXRtZW50IiwgIlNwZWNpZXMiKSkgCgpjbG9zZXN0X2c0LlRPVEFMLjFrYi5lbnJpY2htZW50WywgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbl0KCgpjbG9zZXN0X2c0LlRPVEFMLjFrYi5lbnJpY2htZW50WyAsIGJpbjo9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYmluKSldCgoKRmlnNi5EIDwtIGdncGxvdChjbG9zZXN0X2c0LlRPVEFMLjFrYi5lbnJpY2htZW50KSArCiAgZ2VvbV9saW5lKGFlcyhiaW4sIEVucnJpY2htZW50LCBjb2xvdXI9U3BlY2llcykpICsKICB4bGltKGMoLTEwMDAsIDEwMDApKSArCiAgZmFjZXRfZ3JpZChUcmVhdG1lbnQgfiBwb3MpICsKICB4bGFiKCJEaXN0YW5jZSIpICsKICB5bGFiKCJFbnJpY2htZW50IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNywgCiAgICBhbmdsZSA9IDQ1KSkgCgpGaWc2LkQKCmBgYAoKCgoKCmBgYHtyfQoKCgpyZWFkX2Rpc3RfdGFibGVfcGx1c19taW51cyA8LSBmdW5jdGlvbihwYXRoLnBsdXMsIHBhdGgubWludXMgKXsKICAKZGlzdF90YWJsZS5wbHVzIDwtIGRhdGEudGFibGUocmVhZF9kZWxpbShwYXRoLnBsdXMsIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCBjb2xfbmFtZXMgPSBGQUxTRSwgCiAgICB0cmltX3dzID0gVFJVRSkpCgpkaXN0X3RhYmxlLnBsdXMgPC0gZGlzdF90YWJsZS5wbHVzWywgMjoyMDAxXQpkaXN0X3RhYmxlLnBsdXMgPC0gZGF0YS50YWJsZShhcy5kYXRhLmZyYW1lKHQoZGlzdF90YWJsZS5wbHVzKSkpCmNvbG5hbWVzKGRpc3RfdGFibGUucGx1cykgPC0gYygiUG9zaXRpb24iLCAiT2NjdXJyZW5jZXMiKQoKCmRpc3RfdGFibGUubWludXMgPC0gZGF0YS50YWJsZShyZWFkX2RlbGltKHBhdGgubWludXMsIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCBjb2xfbmFtZXMgPSBGQUxTRSwgCiAgICB0cmltX3dzID0gVFJVRSkpCgpkaXN0X3RhYmxlLm1pbnVzIDwtIGRpc3RfdGFibGUubWludXNbLCAyOjIwMDFdCmRpc3RfdGFibGUubWludXMgPC0gZGF0YS50YWJsZShhcy5kYXRhLmZyYW1lKHQoZGlzdF90YWJsZS5taW51cykpKQpjb2xuYW1lcyhkaXN0X3RhYmxlLm1pbnVzKSA8LSBjKCJQb3NpdGlvbiIsICJPY2N1cnJlbmNlcyIpCgogCmRpc3RfdGFibGUgPC0gIG1lcmdlKGRpc3RfdGFibGUucGx1cywgZGlzdF90YWJsZS5taW51cywgYnk9IlBvc2l0aW9uIikKCmRpc3RfdGFibGVbLCBPY2N1cnJlbmNlczo9KE9jY3VycmVuY2VzLnggKyBPY2N1cnJlbmNlcy55KV0KCmRpc3RfdGFibGVbLCBPY2N1cnJlbmNlczo9KE9jY3VycmVuY2VzLnggKyBPY2N1cnJlbmNlcy55KV0KZGlzdF90YWJsZSA8LSBkaXN0X3RhYmxlWywgYygiUG9zaXRpb24iLCAiT2NjdXJyZW5jZXMiKV0KCgpkaXN0X3RhYmxlWyxtZWRpYW46PW1lZGlhbihPY2N1cnJlbmNlcyldCmRpc3RfdGFibGVbLCBFbnJyaWNobWVudDo9T2NjdXJyZW5jZXMvbWVkaWFuXQpkaXN0X3RhYmxlWywgUG9zaXRpb246PVBvc2l0aW9uLTFdCgpyZXR1cm4oZGlzdF90YWJsZSkgIAp9CgoKYGBgCgoKCgoKCgpgYGB7cn0KCmVucmljaG1lbnRfRzRfc2VxX3Bsb3QgPC0gZnVuY3Rpb24ocGF0aC51cF9wbHVzLnBsdXMsIHBhdGgudXBfcGx1cy5taW51cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kb3duX3BsdXMucGx1cywgcGF0aC5kb3duX3BsdXMubWludXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgudXBfbWludXMucGx1cywgcGF0aC51cF9taW51cy5taW51cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmRvd25fbWludXMucGx1cywgcGF0aC5kb3duX21pbnVzLm1pbnVzICl7CgoKeC51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZV9wbHVzX21pbnVzKHBhdGgudXBfcGx1cy5wbHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnVwX3BsdXMubWludXMpCgoKeC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlX3BsdXNfbWludXMocGF0aC5kb3duX3BsdXMucGx1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kb3duX3BsdXMubWludXMpCgoKeC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGVfcGx1c19taW51cyhwYXRoLnVwX21pbnVzLnBsdXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgudXBfbWludXMubWludXMpCgoKeC5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZV9wbHVzX21pbnVzKHBhdGguZG93bl9taW51cy5wbHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZG93bl9taW51cy5taW51cykKCgp4LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCnguZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKeC5UT1RBTCA8LSBwbG90X2RlbnNpdHkoeC51cF9wbHVzLCB4LnVwX21pbnVzLCB4LmRvd25fcGx1cywgeC5kb3duX21pbnVzKQoKcmV0dXJuKHguVE9UQUwpCgp9CgpgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpoZzE5LlRPVEFMLktDTCA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmhnMTkuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5oZzE5LnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuaGcxOS5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuaGcxOS5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuaGcxOS5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5oZzE5LnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmhnMTkuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5oZzE5LnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIikKCgpoZzE5LlRPVEFMLlBEUyA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuaGcxOS5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuaGcxOS5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuaGcxOS5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5oZzE5LnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmhnMTkuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5oZzE5LnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuaGcxOS5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuaGcxOS5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIikKCgoKc2FjQ2VyMy5UT1RBTC5LQ0wgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iKQoKCnNhY0NlcjMuVE9UQUwuUERTIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iKQoKCm1vdXNlLlRPVEFMLktDTCA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMubW0xMC5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMubW0xMC5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMubW0xMC5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMubW0xMC5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIpCgoKbW91c2UuVE9UQUwuUERTIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMubW0xMC5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMubW0xMC5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMubW0xMC5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIpCgogCgoKZG02LlRPVEFMLktDTCA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuZG02LnNjb3JlLkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuZG02LnNjb3JlLkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuZG02LnNjb3JlLkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5kbTYuc2NvcmUuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmRtNi5zY29yZS5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5kbTYuc2NvcmUuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuZG02LnNjb3JlLkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuZG02LnNjb3JlLkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIikKCgpkbTYuVE9UQUwuUERTIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5kbTYuc2NvcmUuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmRtNi5zY29yZS5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuZG02LnNjb3JlLkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmRtNi5zY29yZS5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5kbTYuc2NvcmUuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5kbTYuc2NvcmUuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5kbTYuc2NvcmUuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmRtNi5zY29yZS5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIikKCgoKCnRhaXIxMC5UT1RBTC5LQ0wgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5iZWRfdGFpcjEwLnNjb3JlLkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuYmVkX3RhaXIxMC5zY29yZS5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iKQoKCnRhaXIxMC5UT1RBTC5QRFMgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuYmVkX3RhaXIxMC5zY29yZS5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuYmVkX3RhaXIxMC5zY29yZS5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIikKCgoKZGFuUmVyMTAuVE9UQUwuS0NMIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIi4vRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIpCgoKCmRhblJlcjEwLlRPVEFMLlBEUyA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAiLi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICIuL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIikKCmBgYAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmhnMTkuVE9UQUwuS0NMWywgVHJlYXRtZW50Oj0iS0NsIl0gCmhnMTkuVE9UQUwuUERTWywgVHJlYXRtZW50Oj0iUERTIl0KaGcxOS5UT1RBTC5LQ0xbLCBTcGVjaWVzOj0iSC4gc2FwaWVucyJdIApoZzE5LlRPVEFMLlBEU1ssIFNwZWNpZXM6PSJILiBzYXBpZW5zIl0gIAoKc2FjQ2VyMy5UT1RBTC5LQ0xbLCBUcmVhdG1lbnQ6PSJLQ2wiXSAgCnNhY0NlcjMuVE9UQUwuUERTWywgVHJlYXRtZW50Oj0iUERTIl0Kc2FjQ2VyMy5UT1RBTC5LQ0xbLCBTcGVjaWVzOj0iUy4gY2VyZXZpc2lhZSJdICAKc2FjQ2VyMy5UT1RBTC5QRFNbLCBTcGVjaWVzOj0iUy4gY2VyZXZpc2lhZSJdICAKCm1vdXNlLlRPVEFMLktDTFssIFRyZWF0bWVudDo9IktDbCJdICAKbW91c2UuVE9UQUwuUERTWywgVHJlYXRtZW50Oj0iUERTIl0gCm1vdXNlLlRPVEFMLktDTFssIFNwZWNpZXM6PSJNLiBtdXNjdWx1cyJdICAKbW91c2UuVE9UQUwuUERTWywgU3BlY2llczo9Ik0uIG11c2N1bHVzIl0gIAoKZG02LlRPVEFMLktDTFssIFRyZWF0bWVudDo9IktDbCJdICAKZG02LlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdCmRtNi5UT1RBTC5LQ0xbLCBTcGVjaWVzOj0iRC4gbWVsYW5vZ2FzdGVyIl0gIApkbTYuVE9UQUwuUERTWywgU3BlY2llczo9IkQuIG1lbGFub2dhc3RlciJdICAKCnRhaXIxMC5UT1RBTC5LQ0xbLCBUcmVhdG1lbnQ6PSJLQ2wiXSAKdGFpcjEwLlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdIAp0YWlyMTAuVE9UQUwuS0NMWywgU3BlY2llczo9IkEuIHRoYWxpYW5hIl0gCnRhaXIxMC5UT1RBTC5QRFNbLCBTcGVjaWVzOj0iQS4gdGhhbGlhbmEiXSAKCmRhblJlcjEwLlRPVEFMLktDTFssIFRyZWF0bWVudDo9IktDbCJdICAKZGFuUmVyMTAuVE9UQUwuUERTWywgVHJlYXRtZW50Oj0iUERTIl0KZGFuUmVyMTAuVE9UQUwuS0NMWywgU3BlY2llczo9IkQuIHJlcmlvIl0gIApkYW5SZXIxMC5UT1RBTC5QRFNbLCBTcGVjaWVzOj0iRC4gcmVyaW8iXQoKClRPVEFMLktDTF9QRFMgPC0gIHJiaW5kKGhnMTkuVE9UQUwuS0NMLCBoZzE5LlRPVEFMLlBEUywgc2FjQ2VyMy5UT1RBTC5LQ0wsIHNhY0NlcjMuVE9UQUwuUERTLCBtb3VzZS5UT1RBTC5LQ0wsIG1vdXNlLlRPVEFMLlBEUywgZG02LlRPVEFMLktDTCwgZG02LlRPVEFMLlBEUywgdGFpcjEwLlRPVEFMLktDTCwgdGFpcjEwLlRPVEFMLlBEUywgZGFuUmVyMTAuVE9UQUwuS0NMLCBkYW5SZXIxMC5UT1RBTC5QRFMpCgoKZ2dwbG90KFRPVEFMLktDTF9QRFMpICsKICBnZW9tX2xpbmUoYWVzKFBvc2l0aW9uLCBFbnJyaWNobWVudCwgY29sb3VyPVNwZWNpZXMpKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoVHJlYXRtZW50IH4gZXhvbl9wb3MpICsKICB4bGFiKCJEaXN0YW5jZSIpICsKICB5bGFiKCJFbnJpY2htZW50IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNywgCiAgICBhbmdsZSA9IDQ1KSkgCgpgYGAKCgoKCgoKCmBgYHtyfQpjbG9zZXN0X2c0X0tDTC5oZzE5LjIwMTUgPC0gY2xvc2VzdF9nNCgiLi4vRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fdXBfcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fZG93bl9wbHVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fZG93bl9taW51cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIpCgoKY2xvc2VzdF9nNF9LQ0wuaGcxOS4yMDE1IDwtIGNsb3Nlc3RfZzQoIi4uL0ZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL1N1cHBsZW1lbnRhcnkvZXhvbl91cF9taW51cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX2Rvd25fcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiKQpgYGAKCgoKYGBge3J9CktDTF91cCA8LSB1bmlxdWUoY2xvc2VzdF9nNF9LQ0xbYWJzKGRpc3QpPj0xMDAgJiBwb3M9PSIzJ1NwbGljZSBzaXRlIiwgcGFzdGUoZWNocm9tLCBlc3RhcnQsIGVlbmQsIHNlcCA9ICJfIildKQoKCmBgYAoKCgoKCgoKCmBgYHtyfQpnZ19jb2xvcl9odWUgPC0gZnVuY3Rpb24obikgewogIGh1ZXMgPSBzZXEoMTUsIDM3NSwgbGVuZ3RoID0gbiArIDEpCiAgaGNsKGggPSBodWVzLCBsID0gNjUsIGMgPSAxMDApWzE6bl0KfQoKZ2dfY29sb3JfaHVlKDMpCmBgYAoKCmBgYHtyfQoKCiBsaWJyYXJ5KGV1bGVycikKCgoKClZlbm5EaWFnLnVwIDwtIGV1bGVyKGMoIk1vdGlmIiA9IDg4MDcrOTMyNSwgIAogICAgICAgICAgICAgICAgICAgICJLIiA9IDk2NTMrMTAwMjksICAKICAgICAgICAgICAgICAgICAgICAiUERTIiA9IDM0ODgwKzM2OTA5LCAKICAgICAgICAgICAgICAgICAgICAiSyZQRFMiID0gOTg5MCs5NTM5LAogICAgICAgICAgICAgICAgICAgICJQRFMmTW90aWYiID0gODMzMSs4ODU1LAogICAgICAgICAgICAgICAgICAgICJLJk1vdGlmIiA9IDQ1MDkrNDc0OSwKICAgICAgICAgICAgICAgICAgICAiSyZQRFMmTW90aWYiID0gNDUwMys0NzQ3KSkKRmlnMS5DMSA8LSBwbG90KFZlbm5EaWFnLnVwLCBjb3VudHMgPSBUUlVFLCBmb250PTIsIGNleD0xLCBhbHBoYT0wLjUsCiAgICAgZmlsbD1nZ19jb2xvcl9odWUoMyksIHF1YW50aXRpZXMgPSBsaXN0KGZvbnRzaXplID0gMTApKQoKClZlbm5EaWFnLmRvd24gPC0gZXVsZXIoYygiTW90aWYiID0gOTUwNysxMDE0MiwgIAogICAgICAgICAgICAgICAgICAgICJLIiA9IDEwMTIwKzkzNjUsICAKICAgICAgICAgICAgICAgICAgICAiUERTIiA9IDM0ODQ0KzM2NzM3LCAKICAgICAgICAgICAgICAgICAgICAiSyZQRFMiID0gOTIzNis5OTg1LAogICAgICAgICAgICAgICAgICAgICJQRFMmTW90aWYiID0gODk3Mys5NTkzLAogICAgICAgICAgICAgICAgICAgICJLJk1vdGlmIiA9IDQ4MDYrNTIyMSwKICAgICAgICAgICAgICAgICAgICAiSyZQRFMmTW90aWYiID0gNDgwMis1MjExKSkKRmlnMS5DMiA8LSBwbG90KFZlbm5EaWFnLmRvd24sIGNvdW50cyA9IFRSVUUsIGZvbnQ9MSwgY2V4PTEsIGFscGhhPTAuNSwKICAgICBmaWxsPWdnX2NvbG9yX2h1ZSgzKSwgIHF1YW50aXRpZXMgPSBsaXN0KGZvbnRzaXplID0gMTApKQoKCkZpZzEuQyA8LSBwbG90X2dyaWQoRmlnMS5DMSwgRmlnMS5DMiwgbnJvdz0xKQpGaWcxLkMKYGBgCgoKYGBge3J9CgoKVmVubkRpYWcudXBfMjAxNSA8LSBldWxlcihjKCJNb3RpZiIgPSAxODEzMiwgIAogICAgICAgICAgICAgICAgICAgICJLIiA9IDM0NzYxLCAgCiAgICAgICAgICAgICAgICAgICAgIlBEUyIgPSA1MDg5NCwgCiAgICAgICAgICAgICAgICAgICAgIksmUERTIiA9IDMxNzExLAogICAgICAgICAgICAgICAgICAgICJQRFMmTW90aWYiID0gMTQ3ODYsCiAgICAgICAgICAgICAgICAgICAgIksmTW90aWYiID0gMTE3OTQsCiAgICAgICAgICAgICAgICAgICAgIksmUERTJk1vdGlmIiA9IDExMjUwKSkKdmVubl9zdXBwLnVwIDwtIHBsb3QoVmVubkRpYWcudXBfMjAxNSwgY291bnRzID0gVFJVRSwgZm9udD0yLCBjZXg9MSwgYWxwaGE9MC41LAogICAgIGZpbGw9Z2dfY29sb3JfaHVlKDMpLCBxdWFudGl0aWVzID0gbGlzdChmb250c2l6ZSA9IDEwKSkKCgpWZW5uRGlhZy5kb3duXzIwMTUgPC0gZXVsZXIoYygiTW90aWYiID0gMTk2NDksICAKICAgICAgICAgICAgICAgICAgICAiSyIgPSAzMzkwOCwgIAogICAgICAgICAgICAgICAgICAgICJQRFMiID0gNDk4MDYsIAogICAgICAgICAgICAgICAgICAgICJLJlBEUyIgPSAzMDkyMCwKICAgICAgICAgICAgICAgICAgICAiUERTJk1vdGlmIiA9IDE1OTUxLAogICAgICAgICAgICAgICAgICAgICJLJk1vdGlmIiA9IDEyNjE1LAogICAgICAgICAgICAgICAgICAgICJLJlBEUyZNb3RpZiIgPSAxMjAyNykpCnZlbm5fc3VwcC5kb3duIDwtIHBsb3QoVmVubkRpYWcuZG93bl8yMDE1LCBjb3VudHMgPSBUUlVFLCBmb250PTEsIGNleD0xLCBhbHBoYT0wLjUsCiAgICAgZmlsbD1nZ19jb2xvcl9odWUoMyksICBxdWFudGl0aWVzID0gbGlzdChmb250c2l6ZSA9IDEwKSkKCnBsb3RfZ3JpZCh2ZW5uX3N1cHAudXAsIHZlbm5fc3VwcC5kb3duLCBsYWJlbHMgPSBjKCIzJyBTcGxpY2Ugc2l0ZSIsICI1JyBTcGxpY2Ugc2l0ZSIpKQoKYGBgCgoKCmBgYHtyfQpkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llcyA8LSBmcmVhZCgiLi4vRmlndXJlcy9GaWd1cmUxL2RhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzIikKCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX21hdHJpeCA8LSB0KGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzKQoKCgpoZWFkZXIgPC0gYXMuY2hhcmFjdGVyKGhlYWQoZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfbWF0cml4LCAxKSkKCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2RmIDwtIGFzLmRhdGEuZnJhbWUodGFpbChkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19tYXRyaXgsIC0xKSkKCmNvbG5hbWVzKGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2RmKSA8LSBoZWFkZXIKCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2RmJHNwZWNpZSA8LSByb3duYW1lcyhkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kZikKCgpkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCA8LSBkYXRhLnRhYmxlKGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2RmKQoKZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHQkbWVkaWFuIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2R0JG1lZGlhbikpCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2R0JHN0LmRldiA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCRzdC5kZXYpKQoKZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHQkc3BlY2llIDwtIGZhY3RvcihkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCRzcGVjaWUgLCBsZXZlbHM9ZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHRbb3JkZXIoLW1lZGlhbildJHNwZWNpZSkKCgoKYGBgCgpgYGB7cn0KRmlnNi5BIDwtIGdncGxvdChkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCwgYWVzKHggPSBzcGVjaWUsIHk9bWVkaWFuKSApICsKICBnZW9tX2Jhciggc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0id2hpdGUiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IChtZWRpYW4gLSBzdC5kZXYpLCB5bWF4ID0gKGFzLm51bWVyaWMobWVkaWFuKSArIGFzLm51bWVyaWMoc3QuZGV2KSkpLCBjb2xvdXI9InJlZCIgLCB3aWR0aD0wLjIpICsKICB0aGVtZV9idygpKwogIHhsYWIoIlNwZWNpZXMiKSArCiAgeWxhYigiRGVuc2l0eSAoRzRzIC8ga0IpIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC43LCAKICAgIGFuZ2xlID0gNDUpKQoKRmlnNi5BCgpgYGAKCmBgYHtyfQoKZGF0YWZyYW1lX2V2b19QRFNfSyA8LSBmcmVhZCgiLi4vRmlndXJlcy9GaWd1cmUxL2RhdGFmcmFtZV9ldm9fUERTX0siKQoKCgoKZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXggPC0gdChkYXRhZnJhbWVfZXZvX1BEU19LKQoKCgpoZWFkZXIgPC0gYXMuY2hhcmFjdGVyKGhlYWQoZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXgsIDEpKQoKZGF0YWZyYW1lX2V2b19QRFNfS19kZiA8LSBhcy5kYXRhLmZyYW1lKHRhaWwoZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXgsIC0xKSkKCmNvbG5hbWVzKGRhdGFmcmFtZV9ldm9fUERTX0tfZGYpIDwtIGhlYWRlcgoKCmRhdGFmcmFtZV9ldm9fUERTX0tfZGYkU3BlY2llcyA8LSByb3duYW1lcyhkYXRhZnJhbWVfZXZvX1BEU19LX2RmKQoKZGF0YWZyYW1lX2V2b19QRFNfS19kdCA8LSBkYXRhLnRhYmxlKGRhdGFmcmFtZV9ldm9fUERTX0tfZGYpCgpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UgPC0gcmJpbmQoZGF0YWZyYW1lX2V2b19QRFNfS19kdFsgLCAuKFNwZWNpZXM9U3BlY2llcywgVHJlYXRtZW50PSJLKyIsIG1lZGlhbj1LX21lZGlhbiwgc3QuZGV2PUtfc3QuZGV2ICApICBdLApkYXRhZnJhbWVfZXZvX1BEU19LX2R0WyAsIC4oU3BlY2llcz1TcGVjaWVzLCBUcmVhdG1lbnQ9IlBEUyIsIG1lZGlhbj1QRFNfbWVkaWFuLCBzdC5kZXY9UERTX3N0LmRldiAgKSAgXSkKCgpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UkbWVkaWFuIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRtZWRpYW4pKQpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2Ukc3QuZGV2IDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRzdC5kZXYpKQoKCmdncGxvdChkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UsIGFlcyh4ID0gU3BlY2llcywgeT1tZWRpYW4sIGdyb3VwPVRyZWF0bWVudCkpICsKICBnZW9tX2JhciggYWVzKGNvbG91cj1UcmVhdG1lbnQgKSwgc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJ3aGl0ZSIsIHBvc2l0aW9uPSJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gKG1lZGlhbiAtIHN0LmRldiksIHltYXggPSAoYXMubnVtZXJpYyhtZWRpYW4pICsgYXMubnVtZXJpYyhzdC5kZXYpKSksIGNvbG91cj0iYmxhY2siICwgd2lkdGg9MC4yLCAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgdGhlbWVfYncoKSsKICB4bGFiKCJTcGVjaWVzIikgKwogIHlsYWIoIkRlbnNpdHkgKEc0cyAvIGtCKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNywgCiAgICBhbmdsZSA9IDQ1KSkKCgoKZGF0YWZyYW1lX2V2b19QRFNfS19kdF9uaWNlJFNwZWNpZXMgPC0gZmFjdG9yKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRTcGVjaWVzICwgbGV2ZWxzPWRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZVtUcmVhdG1lbnQ9PSJQRFMiXVtvcmRlcigtbWVkaWFuKV0kU3BlY2llcykKCgpGaWc2LkMgPC0gIGdncGxvdChkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UsIGFlcyh4PVNwZWNpZXMsIHdlaWdodD1tZWRpYW4sIHltaW49bWVkaWFuLXN0LmRldiwgeW1heD1tZWRpYW4rc3QuZGV2LCBncm91cD1UcmVhdG1lbnQpKSArCiAgICAgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgYWVzKHk9bWVkaWFuLCBjb2xvcj1UcmVhdG1lbnQpLCBmaWxsPSJ3aGl0ZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogICAgIGdlb21fZXJyb3JiYXIgKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIGNvbG91cj0iYmxhY2siLCB3aWR0aD0wLjIpICsKICAgIHRoZW1lX2J3KCkrCiAgeGxhYigiU3BlY2llcyIpICsKICB5bGFiKCJEZW5zaXR5IChHNHMgLyBrQikiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcsIAogICAgYW5nbGUgPSA0NSkpCgoKRmlnNi5DCgpgYGAKCmBgYHtyfQpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UKYGBgCgoKIyMjIyMjIEZpZ3VyZXMgICMjIyMjCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCkZpZzEuQkMgPC0gcGxvdF9ncmlkKEZpZzEuQiwgRmlnMS5DLCBuY29sPTEsIGxhYmVscyA9IGMoIkIiLCAiQyIpLCByZWxfaGVpZ2h0cyA9IGMoMiwgMSkpCgpGaWcxIDwtIHBsb3RfZ3JpZChGaWcxLkEsIEZpZzEuQkMsIG5yb3c9MSwgbGFiZWxzID0gYygiQSIsICIiKSkKCkZpZzEKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD03fQoKRmlnMiA8LSBwbG90X2dyaWQoRmlnMi5BLCBGaWcyLkIsbmNvbCA9IDEgLCBsYWJlbHMgPSJBVVRPIiwgcmVsX2hlaWdodHMgPSBjKDEuNSwgMSkpCkZpZzIKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xNH0KRmlnMy5vbGQgPC0gcGxvdF9ncmlkKEZpZzMuQSwgRmlnMy5CLCBGaWczLkMsIEZpZzMuRCwgbGFiZWxzID0gIkFVVE8iLCBuY29sPTIpCgoKcGxvdF9ncmlkKCBwbG90X2dyaWQoRmlnMy5DLCBGaWczLkQpLCBGaWczLkMubmV3LCBGaWczLkQubmV3LCBuY29sID0gMSkKCgpGaWczLnRvcCA8LSAgcGxvdF9ncmlkKCBGaWczLkEgLEZpZzMuQiwgIEZpZzMuQywgRmlnMy5DLm5ldywgbGFiZWxzID0gIkFVVE8iLCBuY29sPTIpCgpGaWczIDwtcGxvdF9ncmlkKEZpZzMudG9wLCBGaWczLkQubmV3LCBsYWJlbHMgPSBjKCIiLCAiRSIpLCBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEuNSwgMSkgKQoKYGBgCgoKCgpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEzLjM1fQoKCgpGaWc1LmJvdHRvbSA8LSBwbG90X2dyaWQoRmlnNS5BLCBGaWc1LkIsIEZpZzUuQywgRmlnNS5ELCBucm93ID0gMiwgbmNvbCA9IDIgLCBsYWJlbHMgPSBjKCJCIiwgIkMiLCAiRCIsICJFIiksIHJlbF9oZWlnaHRzID0gYygxLCAxLCAxLCAxKSkKCkZpZzUgPC0gcGxvdF9ncmlkKEZpZzUuQTEsIEZpZzUuYm90dG9tLCBucm93PTIsIGxhYmVscyA9IGMoIkEiLCAiIiksICByZWxfaGVpZ2h0cyA9IGMoMiwgNCkpCgpGaWc1CmBgYAoKCgpgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9CgoKRmlnNi50b3AgPC0gcGxvdF9ncmlkKEZpZzYuQSwgRmlnNi5DLCBsYWJlbHMgPSBjKCJBIiwgIkMiKSkKRmlnNi5ib3R0b20gPC0gcGxvdF9ncmlkKEZpZzYuQiwgRmlnNi5ELCBsYWJlbHMgPSBjKCJCIiwgIkQiKSkKCkZpZzYgPC0gcGxvdF9ncmlkKEZpZzYuQSwgRmlnNi5DLCBGaWc2LkIgLCBGaWc2LkQsIGxhYmVscyA9IGMoIkEiLCAiQyIsICJCIiwgIkQiKSAsIG5jb2w9MiwgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDMsIDMpKQoKCkZpZzYgPC0gcGxvdF9ncmlkKEZpZzYudG9wLCBGaWc2LmJvdHRvbSwgcmVsX2hlaWdodHMgPSBjKDEsIDEuNSksIG5yb3c9MikKRmlnNgpgYGAKCgoK